0

次のように、xqueryの変数を使用してノード(名前空間のプレフィックスが付いている)を見つけようとしています:

declare variable $libx_ns as xs:string external;
declare namespace libx=$libx_ns;
declare variable $type as xs:string external;

return doc('xyz')/entry[libx:{$type}][1]

パラメータ値:$ libx_ns ='http://libx.org/xml/libx2'、$ type=libapp。このxqueryを実行すると、次のエラーが表示されます。

[XPST0003]表現が不完全です。

上記のコードは、最後の行を次のように変更すると機能します。

return doc('xyz')/entry[libx:libapp][1]

目的は、ノード名をハードワイヤリング(例:libapp)するのではなく、文字列変数(例:$ type)を使用することです。どうすればいいですか?

サンプルxmlドキュメント:

<entry xmlns:libx="http://libx.org/xml/libx2">
  <libx:libapp> First libapp </libx:libapp>
  <libx:libapp> Second libapp </libx:libapp>
</entry>

ありがとう、ソニー

4

2 に答える 2

1

このXQuery:

declare variable $namespace-uri as xs:string external;
declare variable $local-name as xs:string external;

/entry[*[node-name(.) eq QName($namespace-uri,$local-name)]]

この入力で:

<entry xmlns:libx="http://libx.org/xml/libx2">
    <libx:libapp> First libapp </libx:libapp>
    <libx:libapp> Second libapp </libx:libapp>
</entry>

$namespace-urias'http://libx.org/xml/libx2'および$local-nameasを設定すると、次のようlibappに出力されます。

<entry xmlns:libx="http://libx.org/xml/libx2">
    <libx:libapp> First libapp </libx:libapp>
    <libx:libapp> Second libapp </libx:libapp>
</entry>
于 2011-04-06T18:00:10.700 に答える
0

名前空間が重大な違いではない場合は、次のことを試すことができます。

return doc('xyz')/entry[*[local-name() = $type]][1]

もしそれが:

return doc('xyz')/entry[*[local-name() = $type and namespace-uri() = $libx_ns]][1]
于 2011-04-06T00:52:53.797 に答える