1

私のスクリプトは、に出力する必要がある文字列を作成しますがxhtmlxdmp: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とにかく-ステートメントを使用する方が良いです:

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 に答える