是否有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的一个很好的特性。