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

Cua*_*ina 5 xml xslt xpath xpath-2.0

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

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

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

<xsl:if test="parent[count(child::*) eq 1])"> 
Run Code Online (Sandbox Code Playgroud)

VS

<xsl:if test="parent[count(child::node()) eq 1])"> 
Run Code Online (Sandbox Code Playgroud)

有什么区别?

kjh*_*hes 6

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

主节点类型

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

所述child轴可包含的元素,所以主要节点类型子轴的是element.

每轴节点测试

因此,之间的差child::*child::node()

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

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