我试图在我的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]
目的是为节点名使用字符串变量(例如$ type)而不是硬连接它(例如libapp)。我该怎么做?
示例xml文档:
<entry xmlns:libx="http://libx.org/xml/libx2">
<libx:libapp> First libapp </libx:libapp>
<libx:libapp> Second libapp </libx:libapp>
</entry>
谢谢, 索尼
答案 0 :(得分: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-name
设为libapp
,输出:
<entry xmlns:libx="http://libx.org/xml/libx2">
<libx:libapp> First libapp </libx:libapp>
<libx:libapp> Second libapp </libx:libapp>
</entry>
答案 1 :(得分:0)
如果名称空间不是关键区别,您可以尝试:
return doc('xyz')/entry[*[local-name() = $type]][1]
如果是:
return doc('xyz')/entry[*[local-name() = $type and namespace-uri() = $libx_ns]][1]