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]

目的是为节点名称使用字符串变量(例如 $type),而不是硬连接它(例如 libapp)。我该怎么做?

示例 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 回答