XPath child :: * vs child :: node()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPath child :: * vs child :: node()相关的知识,希望对你有一定的参考价值。

我正在进行XSLT转换,我发现了一个我无法回答的有趣问题:

child::*child::node()有什么区别?

我想创建一个条件,在其中我将children元素的数量分隔为1,在这种情况下:

<xsl:if test="parent[count(child::*) eq 1])"> 

VS

<xsl:if test="parent[count(child::node()) eq 1])"> 

有什么区别?

答案

要理解XPath中child::*child::node()之间的区别,不仅要了解*node()节点测试之间的区别,还要了解轴的principal node type的概念......

主节点类型

规则:如果一个轴可以包含元素,那么它的主节点类型是element;否则,它是轴可以包含的节点类型。 (例如,attribute轴的主要节点类型是attribute,因为它只能包含属性。)

child轴可以包含元素,因此子轴的主节点类型是element

每轴节点测试

因此,child::*child::node()之间的区别在于

  • *轴上的child节点测试对上下文节点的所有子元素都成功,因为*节点测试对主节点类型的所有节点都成功(element,这里)
  • node()节点测试成功完成上下文节点的所有子节点,因为node()节点测试对所有节点类型都成功。但请注意,并非所有节点类型都可以在child轴上。以下是七种类型的节点以及它们是否可以出现在子轴上: root:不,根据定义,根是其他节点的子节点。 元素:是的 文字:是的 attribute:不,属性有自己的轴。 namespace:不,命名空间有自己的轴。 处理说明:是的 评论:是的

因此,child::*匹配上下文节点的所有元素子节点,child::node()匹配上下文节点的所有元素,文本和处理指令子节点。

另一答案

child :: *和child :: node()之间有什么区别。

引用here

  • *匹配任何元素
  • node()匹配属性节点和根节点以外的任何节点

所以child::*只匹配子元素,child::node()匹配除属性和根节点之外的任何子节点。这些可以是七种节点类型中的五种:元素,注释,文本和命名空间节点以及处理指令(see here)。

以上是关于XPath child :: * vs child :: node()的主要内容,如果未能解决你的问题,请参考以下文章

CSS Child vs Descendant 选择器

nth-of-type vs nth-child

RF库XML测试通过xpath查找元素的说明

从 org.w3c.dom.Node 获取 Xpath

XPath

xpath获取同级节点