我一直在研究XPath的节点测试(documentation here),并在一些示例xml上进行了测试。
<apartment residents="4" shared="true">
fries
<!-- potatosalad -->
</apartment>
// apartment / @ * 属性的Kindtest将同时返回居民和共享,这意味着它们都是公寓的子代节点,任何类型的 // apartment / nodes()的Kindtest将返回文本节点 fries 和注释节点 potatosalad ,但是不是属性节点 residents 或 shared 。
这对我来说似乎是违反直觉的,我想知道:这是否有充分的理由?
答案 0 :(得分:1)
XPath //apartment/node()
将选择所有apartment
元素的 child 节点,它们是*
,processing-instruction()
,comment()
和text()
。
属性和名称空间的特殊之处在于,它们的父级是它们“附加到”的元素,但是它们不被视为 child 节点,因此不会从 child < / strong>轴。
规格中有关子轴的信息(为强调起见,我添加了粗体):
https://www.w3.org/TR/2017/REC-xpath-31-20170321/#axes
子轴包含上下文节点的子节点,即Section 5.3 children Accessor返回的节点。
注意:仅文档节点和元素节点具有子级。如果上下文节点是任何其他类型的节点,或者上下文节点是空文档或元素节点,则子轴是空序列。 文档节点或元素节点的子代可以是元素,处理指令,注释或文本节点。属性,名称空间和文档节点永远不能显示为子级。
https://www.w3.org/TR/xpath-datamodel-31/#ElementNodeOverview
- 不包括属性和命名空间节点,如果节点N具有父元素E,则N必须在E的子元素之中。(属性和命名空间节点具有父元素,但它们不出现在子元素之中)
答案 1 :(得分:0)
“为什么?”问题总是很困难。我们可以指出规范中的规则,说这就是它的作用,但是,即使确实有一个自觉的决定,我们也很少能发现委员会在他们做出决定时的想法。我们真正能做的就是推测为什么有人会认为这是一个好的设计。
当您意识到C:\Users\Administrator\AppData\Local\Programs\Python\Python35\Lib\site-packages\scipy\extra-dll
是node()
,在此用作NodeTest
时,此决定就很有意义。 AxisStep
的格式为AxisStep
,其中[Axis::]NodeTest
部分默认为“ child ::”。拥有“子级或属性级”轴不是很有用,因为Axis
会模棱两可。因此没有一个,这意味着当child-or-attribute::XYZ
恰好是NodeTest
时,将其用作默认轴是没有意义的。
基本上,轴步长有完整的语法,它是高度正交的(您可以将任何轴与任何NodeTest一起使用),并且正交性是语言设计人员所高度重视的。然后是一种简化的语法,以使常见情况不太冗长;缩写不那么正交,但是有一定的一致性,一致的规则之一是默认轴是子轴,但在2.0中,NodeTest仅选择属性或名称空间节点。