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()的主要内容,如果未能解决你的问题,请参考以下文章