我正在使用 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 表达式中使用元素或属性的名称,它根本就不起作用
这看起来确实像一个错误,但我可能会遗漏一些东西。有人可以指出我做错了什么吗?