为什么XPath的节点测试node()不返回属性Nodes?

时间:2018-07-18 22:39:39

标签: xml xpath

我一直在研究XPath的节点测试(documentation here),并在一些示例xml上进行了测试。

<apartment residents="4" shared="true"> 
      fries
      <!-- potatosalad -->
</apartment>

// apartment / @ * 属性的Kindtest将同时返回居民共享,这意味着它们都是公寓的子代节点,任何类型的 // apartment / nodes()的Kindtest将返回文本节点 fries 和注释节点 potatosalad ,但是不是属性节点 residents shared

这对我来说似乎是违反直觉的,我想知道:这是否有充分的理由?

2 个答案:

答案 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

  
      
  1. 不包括属性和命名空间节点,如果节点N具有父元素E,则N必须在E的子元素之中。(属性和命名空间节点具有父元素,但它们不出现在子元素之中
  2.   

答案 1 :(得分:0)

“为什么?”问题总是很困难。我们可以指出规范中的规则,说这就是它的作用,但是,即使确实有一个自觉的决定,我们也很少能发现委员会在他们做出决定时的想法。我们真正能做的就是推测为什么有人会认为这是一个好的设计。

当您意识到C:\Users\Administrator\AppData\Local\Programs\Python\Python35\Lib\site-packages\scipy\extra-dllnode(),在此用作NodeTest时,此决定就很有意义。 AxisStep的格式为AxisStep,其中[Axis::]NodeTest部分默认为“ child ::”。拥有“子级或属性级”轴不是很有用,因为Axis会模棱两可。因此没有一个,这意味着当child-or-attribute::XYZ恰好是NodeTest时,将其用作默认轴是没有意义的。

基本上,轴步长有完整的语法,它是高度正交的(您可以将任何轴与任何NodeTest一起使用),并且正交性是语言设计人员所高度重视的。然后是一种简化的语法,以使常见情况不太冗长;缩写不那么正交,但是有一定的一致性,一致的规则之一是默认轴是子轴,但在2.0中,NodeTest仅选择属性或名称空间节点。