我正在阅读和测试XQuery以及我使用BaseX(www.basex.org)和saxon-HE 9.4.0.6N的测试工具。 对于以下简单的XML文件 - 没有附加到sample.xml的模式:
<rootab>
<l1>
<items p="a">
<itema x1="10" id="abc">testa</itema>
<itemb x1="10" id="dfe">testb</itemb>
<itemc x1="10" id="jgh">testc</itemc>
</items>
</l1>
<l2>
<items p="b">
<itema x1="10" xidref="abc">testa</itema>
<itemc x1="10" xidref="jgh">testc</itemc>
<itemd x1="10" xidref="abc">testA101</itemd>
<iteme x1="10" xidref="jgh">testB202</iteme>
</items>
</l2>
</rootab>
在Basex_GUI中输入以下XPath表达式://idref("abc")/..
结果是:<itema x1="10" xidref="abc">testa</itema>
在BaseX_GUI中,如果我添加简单的XQuery表达式:
for $x in doc('sample.xml')//idref("abc")/..
return <aaa>{$x}</aaa>
结果是:
<aaa>
<itema x1="10" xidref="abc">testa</itema>
</aaa>
<aaa>
<itemd x1="10" xidref="abc">testA101</itemd>
</aaa>
q1)为什么XPath表达式只返回一个节点?我期待两个......
在Saxon中,使用以下xql文件:
<test>
{
doc('sample.xml')//idref("abc")/..
}
</test>
或XQuery表达式,我通过运行命令query sample.xql
得到相同的结果:
<?xml version="1.0" encoding="UTF-8"?><test/>
q2)我的撒克逊测试有什么问题?
提前感谢您的帮助!
答案 0 :(得分:2)
基本上,idref()
对DTD验证很敏感 - 它会识别DTD中声明为 IDREF 类型的属性。
您尚未向我们展示您的DTD,更重要的是,您尚未展示如何提供查询输入。有许多构造输入的方法,其中属性的“IDREF-ness”丢失 - 例如,通过DOM。即使在Saxon中使用doc()
函数,构建输入树的方式也取决于许多因素,包括配置选项和URIResolver。
我看到你正在使用.NET。当Saxon在.NET上使用Microsoft XML解析器时,它不知道哪些属性是ID和IDREF,因此id()
和idref()
函数不起作用(MS解析器根本不提供此信息)。因此,您需要使用Saxon产品附带的JAXP解析器(Xerces)。我认为这是默认情况。
所以不是一个真正的答案,但希望有一些背景可以解释一些可能出错的事情。