使用idref的XPath表达式

时间:2012-12-05 03:21:59

标签: xpath xquery-3.0

我正在阅读和测试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)我的撒克逊测试有什么问题?

提前感谢您的帮助!

1 个答案:

答案 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)。我认为这是默认情况。

所以不是一个真正的答案,但希望有一些背景可以解释一些可能出错的事情。