xml - XPath child::* 与 child::node()

标签 xml xslt xpath xpath-2.0

我正在处理 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 typeattribute,因为它只能包含属性。)

轴可以包含元素,所以子轴的主节点类型元素

每个轴的节点测试

因此,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/

相关文章:

php - 什么是最好的 php DOM 2 数组函数?

xml - xslt如何选择当前节点或先前的同级,但不能同时选择两者

php - 迭代 SimpleXml xpath 结果

xml - XSLT、XPath 和 InStr

xml - 将对象传递到 Template::Toolkit

java - 如何使用 XPATH 到达特定的子节点?

c# - 如何根据特定条件对 XML 文件中的值求和

xslt - 在 XSL 中组合两个节点集

java - XML:处理大数据

javascript - 路径。如何选择所有文本节点但只选择 'option'元素中的 'select'