我正在处理 XSLT 转换,我发现了一个我无法回答的有趣问题:
child::*
和 child::node()
有什么区别
?
我想创建一个条件,在这个条件下我将子元素的数量定为 1,在这种情况下:
<xsl:if test="parent[count(child::*) eq 1])">
对比
<xsl:if test="parent[count(child::node()) eq 1])">
有什么区别?
最佳答案
要理解XPath中child::*
和child::node()
的区别,不仅要理解*
的区别> 和node()
节点测试,也是principal node type的概念一个轴...
主节点类型
规则:如果一个轴可以包含元素,那么它的主节点类型是元素
;否则,它是轴可以包含的节点类型。 (例如attribute
轴的principal node type是attribute
,因为它只能包含属性。)
子
轴可以包含元素,所以子轴的主节点类型是元素
。
每个轴的节点测试
因此,child::*
和child::node()
的区别在于
child
轴上的*
节点测试对所有 child 元素 成功 context 节点,因为*
节点测试成功用于主要节点类型的所有节点(元素
,此处)而node()
节点测试对所有子节点成功 上下文节点,因为node()
节点测试对所有节点类型 成功。但是,请注意并非所有节点类型都可以位于child
轴上。下面是七种类型的节点以及它们是否可以出现在子轴上:- root:不,根据定义,根不是其他节点的子节点。
- 元素:是
- 文本:是
- attribute:不,属性有自己的轴。
- 命名空间:不,命名空间有自己的轴。
- 处理指令:是
- 评论:是
因此,child::*
匹配上下文节点的所有element 子节点,child::node()
匹配所有< em>上下文节点的元素、文本和处理指令。
关于xml - XPath child::* 与 child::node(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46121524/