2011-04-06 27 views
0

我試圖使用變量在我的XQuery像這樣找一個節點(帶有命名空間前綴):的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 )。我將如何做到這一點?

示例XML文檔:

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

感謝, 索尼

回答

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-uri'http://libx.org/xml/libx2'$local-namelibapp,輸出:

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

@Alejandro:你helpful..again: ) – sony 2011-04-07 05:36:35

0

如果命名空間是不是一個關鍵的區別,你可以嘗試:

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

如果是:

return doc('xyz')/entry[*[local-name() = $type and namespace-uri() = $libx_ns]][1] 
相關問題