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