我一直在研究XPath的节点测试(在此处提供文档),并在一些示例xml上对其进行了测试。
<apartment residents="4" shared="true">
fries
<!-- potatosalad -->
</apartment>
属性// apartment / @ *的Kindtest将同时返回居民和共享的意思,它们都是公寓节点的子代,而任何种类的Kindtest // apartment / nodes()将返回文本节点fries和注释节点potatosalad 但不是属性节点居民或共享。
这对我来说似乎违反直觉,我想知道:这是否有充分的理由?
中的XPath//apartment/node()
将选择所有的apartment
元素的子节点,它们是*
,processing-instruction()
,comment()
,和text()
。
属性和名称空间是特殊的,因为它们的父级是它们“附加到”的元素,但是它们不被视为子节点,因此不会从子轴中选择。
规格中有关子轴的信息(为强调起见,我添加了粗体):
https://www.w3.org/TR/2017/REC-xpath-31-20170321/#axes
子轴包含上下文节点的子节点,即5.3节children Accessor返回的节点。
注意:只有文档节点和元素节点才有子节点。如果上下文节点是任何其他类型的节点,或者上下文节点是空文档或元素节点,则子轴是空序列。文档节点或元素节点的子级可以是元素,处理指令,注释或文本节点。属性,名称空间和文档节点永远不能显示为子级。
https://www.w3.org/TR/xpath-datamodel-31/#ElementNodeOverview
- 不包括属性和命名空间节点,如果节点N具有父元素E,则N必须在E的子元素之中。(属性和命名空间节点具有父元素,但不会出现在其父元素的子元素中。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句