xQuery将字符串转换为xhtml

时间:2012-07-05 19:04:26

标签: xml xquery marklogic

我的脚本构建了一个我需要输出到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 个答案:

答案 0 :(得分: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语句:

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."
        }
    )

答案 1 :(得分: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 )

答案 2 :(得分:0)

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

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}         

答案 3 :(得分:0)

如果要完全生成每种情况,则可以使用较短的文字xml构造函数,因为所有qname都是常量

      ...

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

imho dericksons是最优雅的

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