我正在读的一本关于 XML 的书说,要选择 XML 文件中具有特定属性的所有节点,请使用以下语法:
//*/@_attribute_
我不明白的是为什么需要星号。据我了解,表达式 // 选择根节点的所有后代。那么,例如 //@lang 不会选择具有名为“lang”属性的根节点的所有后代吗?我什至无法解释上面表达式中星号的含义(我知道星号通常意味着“全部”)。如果有人能为我分解它,我将非常感激。
Thanks
你好,我正在读的一本关于 XML 的书说
选择 XML 中的所有节点
具有特定属性的文件,
使用语法:
//*/@attribute
那是错误的。它将扩展为:
/descendant-or-self::node()/child::*/attribute::attribute
意义:All attribute
作为根文档本身或其后代之一的节点的任何子元素的属性
你需要:
/descendant::*[attribute::attribute]
或者缩写形式
//*[@attribute]
有关*
: 正式来说是姓名测试 not a 节点类型测试。在 XPath 1.0 中没有元素类型测试。在 XPath 2.0 中你有element()
。那么,为什么只选择元素呢?嗯,事实并非如此。该轴有一个主要节点类型,从http://www.w3.org/TR/xpath/#node-tests http://www.w3.org/TR/xpath/#node-tests :
每个轴都有一个主要节点类型。
如果轴可以包含元素,那么
主要节点类型是element;
否则,它是节点的类型
轴可以包含的内容。因此,
- 对于属性轴,主要节点类型是属性。
- 对于命名空间轴,主要节点类型是命名空间。
- 对于其他轴,主要节点类型是元素。
这就是为什么*
,child::*
,self::*
,descendant::*
等选择元素,但是@*
or attribute::*
or namespace::*
选择属性或范围命名空间。
关于谓词([@attribute]
部分):此表达式使用上一步选择的每个节点进行计算。它需要一个布尔值来进行过滤。节点集的布尔值(这是以下结果attribute::attribute
) 对于空节点集为 false,否则为 true。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)