用于选择具有公共属性的所有节点的XPath表达式

时间:2010-10-22 21:59:43

标签: xml xpath

我正在阅读XML的一本书说,要选择XML文件中具有特定属性的所有节点,请使用以下语法:

//*/@_attribute_

我不明白为什么需要星号。据我了解,表达式//选择根节点的所有后代。那么,不会// @ lang,例如,选择具有名为“lang”属性的根节点的所有后代?我甚至无法解释星号在上面的表达式中的含义(我知道星号一般意味着“全部”)。如果有人可以为我分解,我真的很感激。

由于

2 个答案:

答案 0 :(得分:15)

  

嗨,我正在阅读一本关于XML的书   那就是选择XML中的所有节点   具有特定属性的文件,   使用语法:

     

//*/@attribute

那是错的。它将扩展为:

/descendant-or-self::node()/child::*/attribute::attribute

含义:节点的任何元素子节点的所有attribute属性是根文档本身或其后代之一

你需要:

/descendant::*[attribute::attribute]

或缩写形式

//*[@attribute]

关于*:formaly是名称测试而不是节点类型测试。在XPath 1.0中,没有元素类型测试。在XPath 2.0中,您有element()。那么,为什么只选择元素呢?嗯,事实并非如此。轴具有主要节点类型,来自http://www.w3.org/TR/xpath/#node-tests

  

每个轴都有一个主节点类型。   如果轴可以包含元素,那么   主节点类型是元素;   否则,它是节点的类型   轴可以包含。因此,

     
      
  • 对于属性轴,主节点类型是属性。
  •   
  • 对于名称空间轴,主节点类型是名称空间。
  •   
  • 对于其他轴,主节点类型为element。
  •   

这就是*child::*self::*descendant::*等选择元素的原因,但是@*attribute::*或{{1选择属性或在范围名称空间中。

关于谓词(namespace::*部分):评估此表达式,每个节点按最后一步选择。它需要一个用于过滤的布尔值。对于空节点集,节点集的布尔值(这是[@attribute]的结果)为false,否则为true。

答案 1 :(得分:13)

此问题的标题是

  

用于选择全部的XPath表达式   具有公共属性的节点

然而,问题的文本没有讨论如何找到具有共同属性的所有节点 - 因此标题可能不正确。

要查找具有名为x 的公共属性的所有节点(BTW,只有元素节点可以包含属性),使用

//*[@x]

使用

//@x

选择XML文档中名为x的所有属性。这可能是最短的表达方式。

没有任何问题
//*/@x

除了稍长一点。

这是

的简写
/descendant-or-self::node()/child::*/attribute::x

并选择XML文档中的所有x属性。

有人可能认为此表达式未选择文档中顶部元素的x属性。这是一个错误的结论,因为第一个位置步骤:

/descendant-or-self::node()

选择文档中的每个节点,包括 root /)本身。

这意味着:

/descendant-or-self::node()/child::*

选择每个元素,包括top元素(格式良好的XML文档中根节点的唯一子元素)。

因此,当最后添加最后一个位置步骤/@x时,这将选择到目前为止前两个位置步骤选择的所有节点的所有x属性 - 即全部{{1 XML文档中所有元素节点的属性。