Xquery - 使用变量查找带有名称空间前缀的节点

时间:2011-04-06 00:36:47

标签: namespaces xquery nodename

我试图在我的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>

谢谢, 索尼

2 个答案:

答案 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]