0

我正在使用 eXist-db 版本:1.4.1(SVN 修订版:15155,内部版本:20110815)并且当 XPath 表达式涉及元素或属性的名称并且 XML 数据来自 doc()功能。我在 XQuery SandBox 中测试了以下查询。

XQuery 中的以下查询

xquery version "1.0";
let $data := <users>
    <user id="1" gender="male">Jon Doe</user>
    <user id="2" gender="female">Jane Smith</user>
    <user id="3" gender="male">Some Guy</user>
    <user id="4" gender="female">Some Gal</user>
</users>
return $data//user[@gender="female"]

产生预期的结果。

<user id="2" gender="female">Jane Smith</user>
<user id="4" gender="female">Some Gal</user>

但是,如果我将 XML 数据移动到 eXists 中的文件 /db/test.xml (包含此内容)

<users>
    <user id="1" gender="male">Jon Doe</user>
    <user id="2" gender="female">Jane Smith</user>
    <user id="3" gender="male">Some Guy</user>
    <user id="4" gender="female">Some Gal</user>
</users>

并执行查询

 xquery version "1.0";
 let $data := doc("/db/test.xml")
 return $data//user[@gender="female"]

结果是空集!

奇怪的是,如果我省略元素和属性的名称,我设法获得预期的结果,就像在这个查询中一样

xquery version "1.0";
let $data := doc("/db/test.xml")
return $data//*[@*="female"]

如果我使用 XPath 轴而不是缩写,它甚至可以工作

xquery version "1.0";
let $data := doc("/db/test.xml")
return $data/descendant-or-self::node()/child::*[attribute::*="female"]

我还设法列出了 XML 文件中的所有文本

xquery version "1.0";
let $data := doc("/db/test.xml")
return $data//text()

但是如果我在 XPath 表达式中使用元素或属性的名称,它根本就不起作用

这看起来确实像一个错误,但我可能会遗漏一些东西。有人可以指出我做错了什么吗?

4

1 回答 1

0

我花了两天时间与它战斗。将“*”命名空间添加到 xPath 为我解决了这个问题(我的输入文件没有任何内容)。

return <label>{fn:doc(fn:concat($collection, '/', $child))//*:testResult/text()}</label>
于 2016-06-03T11:17:03.910 回答