2017-04-24 107 views
2

我想了解下面的例子为什么不//返回文档节点?

<?xml version="1.0" encoding="UTF-8"?> 

<c> 
    <a> 
    <b att1="5"> 
     <c/> 
    </b> 
    <d/> 
    </a> 
    <a att1="10"> 
    <d> 
     <c/> 
    </d> 
    <b/> 
    </a> 
</c> 

现在我运行XPath查询

//*[c] 

,我采取的意思是“有一个孩子是一个C的所有节点”。但是,这只会返回<b><d>节点,该节点具有<c>子级,而不会像我期望的那样返回Document节点。谁能解释为什么?

回答

3

因为//*等于/descendant-or-self::node()/*。请注意,在前一个XPath中由self::node()引用的文档节点,因此该XPath选择的最外面的节点将是文档节点的子节点(归因于/*),它是根元素c,它没有直接子节点c,因此没有被选中。

您希望/descendant-or-self::node()[c]包含文档节点,相当于//.[c],请参阅the demo

+0

好的很清楚,谢谢! – anonnona

+1

我会加上'“*”'表示'child :: *','child :: *'只选择元素节点。所以即使你编写'self :: *',它也不会选择文档节点,因为文档节点不是一个元素。 –

相关问题