1

XQuery で、変数からノードのタグを設定するために、xml と計算された要素コンストラクターを混在させるにはどうすればよいですか。

私はこのようにしてみましたが、うまくいきませんでした:

 if ($x eq "something") then
    <cp:value>
      {element {fn:string-join( ("if:GICS", $cp/@id), "" )} {""}}
    </cp:value>

予想される出力は次のとおりです。

<cp:value>
  <if:GICS1234 />
</cp:value>
4

2 に答える 2

2

要素コンストラクターの要素名の部分には、xs:QName要素名を生成するためのが必要です。文字列が指定されている場合は、 `xs:QName('my-element-name')を呼び出したかのようにQNameに強制します。

xs:QName()したがって、明示的なコンストラクターがあるかのように、従うすべてのルールに従う必要があります。つまり、名前空間プレフィックス(などif:)を使用している場合は、静的コンテキストでこの名前空間を解決できる必要があります。

あなたができる最も簡単なことはif:、あなたのプロローグであなたの名前空間を宣言することです(おそらくあなたがあなたのcp:名前空間を宣言したように):

declare namespace if = "http://example.org/if";
element {fn:concat('if:GICS','1234') } {}

(: usually produces <if:GICS1234 xmlns:if="http://example.org/if"/> :)

これを行いたくない場合は、fn:QName()関数との完全な名前空間を使用して、QNameを明示的に作成できますif:。(注*fn:*QNameは!とは異なり*xs:*QNameます)

element {fn:QName('http://example.org/if', fn:concat('GICS', '1234'))} {}

(: usually produces <GICS1234 xmlns="http://www.example.org/if"/> :)

使用するプレフィックスを制御する場合は、2番目の引数に「if:」を含めることができます。

element {fn:QName('http://example.org/if', fn:concat('if:GICS','1234'))} {}

(: produces <if:GICS1234 xmlns:if="http://example.org/if"/> :)

xml出力で取得するプレフィックスは、xqueryプロセッサや作成するxmlの構造によって異なる場合がありますが、常に同等のXMLインフォセットを取得することに注意してください。

于 2012-12-21T13:21:39.073 に答える
0

文字列にネームスペース プレフィックスを直接含めることはできません。名前空間の URL から名前空間を含む QName を作成する必要があります。

次のようなものを使用します

if ($x eq "something") then
  <cp:value>
    {element {fn:QName("if namespace url", fn:string-join( ("if:GICS", $cp/@id), "" ))} {""}}
  </cp:value>

また、string-join の代わりに concat を使用することもできます

if ($x eq "something") then
  <cp:value>
    {element {fn:QName("if namespace url", fn:concat( ("if:GICS", $cp/@id) ))} {""}}
  </cp:value>
于 2012-12-21T13:01:38.980 に答える