1

我的脚本构建了一个我需要输出到的字符串xhtml,但xdmp:unquote()似乎不喜欢带引号的属性值,特别是引号。我最终在输出中的实际引号 (") 应该是引号字符实体。

这是字符串:

let $title_opts :=  if ( "M.D." eq $acad_title )
                then
                    '<option selected="SELECTED" value="M.D.">M.D.</option><option value="D.O.">D.O.</option>'
                else if ( "D.O." eq $acad_title ) 
                then
                    '<option value="M.D.">M.D.</option><option selected="SELECTED" value="D.O.">D.O.</option>'
                else
                    '<option value="M.D.">M.D.</option><option value="D.O.">D.O.</option>'

和输出:

return <select name="title" id="title">
            { xdmp:unquote( $title_opts ) }
        </select>

尖括号可以很好地使用xdmp:unquote(),但引号不能。如何让所有内容正确显示?

4

4 回答 4

3

不要将 XQuery 元素构造为字符串。如果您需要返回多个顶级元素并且无法将它们包装在另一个元素中,请使用序列。

let $title_opts :=  if ( "M.D." eq $acad_title )
                then
                (
                    <option selected="SELECTED" value="M.D.">M.D.</option>,
                    <option value="D.O.">D.O.</option>
                )
                else if ( "D.O." eq $acad_title ) 
                then
                (
                    <option value="M.D.">M.D.</option>,
                    <option selected="SELECTED" value="D.O.">D.O.</option>
                )
                else
                (
                    <option value="M.D.">M.D.</option>,
                    <option value="D.O.">D.O.</option>
                )

无论如何最好使用switch-statement:

let $title_opts := switch ($acad_title) 
    case "M.D." return
        (
            <option selected="SELECTED" value="M.D.">M.D.</option>,
            <option value="D.O.">D.O.</option>
        )
    case "D.O." return
        (
            <option value="M.D.">M.D.</option>,
            <option selected="SELECTED" value="D.O.">D.O.</option>
        )   
    default return
        (
            <option value="M.D.">M.D.</option>,
            <option value="D.O.">D.O.</option>
        )

或者,如果您使用元素构造函数,则仅根据需要添加属性。

let $title_opts :=
    (
        element { "option" } {
            if ( "M.D." eq $acad_title )
            then attribute { "selected" } {"selected" }
            else (),
            attribute { "value" } { "M.D." },
            "M.D."
        },
        element { "option" } {
            if ( "D.O." eq $acad_title )
            then attribute { "selected" } {"selected" }
            else (),
            attribute { "value" } { "D.O." },
            "D.O."
        }
    )
于 2012-07-05T20:34:37.643 回答
1

看来您正在尝试为 xhtml 构建选项元素。虽然我喜欢提供的许多其他解决方案中的 XQuery,但我相信代码有太多硬编码。为什么不将生成选项 XHTML 元素的工作转移到辅助函数中呢?

declare function local:xhtml-options( $options as xs:string*, $selected as xs:string*) as element(option)* {

    for $option in $options
    return
        element option {
            if($option = $selected) then attribute selected {"SELECTED"} else (),
            attribute value {$option},
            text { $option }
        }

};


local:xhtml-options( ("M.D.", "D.0"), $acad_title )
于 2012-07-09T15:24:39.840 回答
0

好的,所以看起来我必须将我的选项构建为选择元素,而不是字符串:

let $title_opts :=  if ( "M.D." eq $acad_title )
                then
                    element select {
                        attribute name {"title"}, 
                        attribute id {"title"}, 
                        element option {
                            attribute selected {"SELECTED"},
                            attribute value {"M.D."},
                            "M.D."
                        }, 
                        element option {
                            attribute value {"D.O."},
                            "D.O."
                        }
                    }
                else if ( "D.O." eq $acad_title ) 
                then
                    element select {
                        attribute name {"title"}, 
                        attribute id {"title"}, 
                        element option {
                            attribute value {"M.D."},
                            "M.D."
                        }, 
                        element option {
                            attribute selected {"SELECTED"},
                            attribute value {"D.O."},
                            "D.O."
                        }
                    }
                else
                    element select {
                        attribute name {"title"}, 
                        attribute id {"title"}, 
                        element option {
                            attribute value {"M.D."},
                            "M.D."
                        }, 
                        element option {
                            attribute value {"D.O."},
                            "D.O."
                        }
                    }

返回 { $title_opts }

于 2012-07-05T19:53:47.300 回答
0

如果您要完全生成每个案例,您可以使用较短的文字 xml 构造函数,因为所有 qnames 都是常量

...

使用动态构造函数的建议是因为您可以更轻松地有条件地生成元素的一部分,从而减少重复代码。完全构建每个变体会破坏该好处......产生相同的结果但使用最多的代码。

imho dericksons 是最优雅的

所有变体在功能上都是等效的,并且应该具有相似的性能

于 2018-10-24T05:43:46.137 回答