是否有XPATH函数或运算符来比较节点的深度?

是否有XPATH函数或运算符来比较节点的深度?,xpath,xslt-2.0,Xpath,Xslt 2.0,例如: <ul> <li>item 1</li> <ul> <li>item 2</li> <li>item 3</li> <ul> <li>item 5</li> <!-- context node --> </ul> </

例如:

<ul>
    <li>item 1</li>
    <ul>
        <li>item 2</li>
        <li>item 3</li>
        <ul>
            <li>item 5</li> <!-- context node -->
        </ul>
    </ul>
    <li>item 6</li>
</ul>
  • 项目1
    • 项目2
    • 项目3
      • 项目5
  • 项目6
如果带有文本
项目5
li
元素是上下文节点,则表达式
如下:*
将生成带有文本
项目6
li
元素。是否有一种内置的方法来获得这些节点的深度差异?i、 e如果我们将根
ul
定义为深度0,那么它的子项(
li
项目1,
ul
li
项目6)将具有深度1,依此类推<代码>li项目5的深度为3


可以从两个节点使用
祖先
轴,但不知道是否有其他方法。另一种可能是在遍历树时保留状态信息,如果父级有以下同级?

问题被标记为XSLT 2,但正如您提到的树遍历以保留状态信息,可能值得一提的是XSLT 3累加器,例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:mode use-accumulators="depth"/>
    
  <xsl:accumulator name="depth" as="xs:integer" initial-value="0">
      <xsl:accumulator-rule match="/" select="0"/>
      <xsl:accumulator-rule match="*" select="$value + 1"/>
      <xsl:accumulator-rule match="*" phase="end" select="$value - 1"/>
  </xsl:accumulator>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="*">
      <xsl:comment select="accumulator-before('depth'), count(ancestor-or-self::*)"/>
      <xsl:next-match/>
  </xsl:template>
  
</xsl:stylesheet>


我知道您已将根元素的值定义为0,但将0用于根节点
/
,然后将
+1
用作其子元素的深度对我来说似乎更合理。

使用(祖先计数?
轴)有什么不起作用?至于在遍历树时保留状态信息,在XSLT 3中,您可以使用累加器来实现。@MartinHonnen如果
祖先
轴可以工作,我很好奇是否有更优雅的解决方案。累加器是XSLT3的一个很好的特性。