gpt4 book ai didi

xslt - 使用 XPath 和 XSLT 检查任何级别的父节点

转载 作者:行者123 更新时间:2023-12-03 16:10:32 24 4
gpt4 key购买 nike

我已经搜索过,但可能只是因为我不知道要搜索什么而错过了一些明显的东西。而且我发现很难将我的问题解释为一个简单的问题,所以让我解释一下:我正在使用以下代码(XSLT 1.0 和 XPath)来检查该节点的父节点是否属于最后一个祖父节点:

<xsl:when test="count(parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)">

它完全按照我想要的方式工作。不过,我希望以一种或另一种方式使其更通用,以使其与更多父节点一起使用。我可以添加另一个模板匹配并添加另一个测试:
<xsl:when test ="count(parent::*/parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)">

有没有办法在递归模板循环中添加“parent::*/”而不是创建很多特定的模板匹配?还是我应该完全编写出更好的 XPath 代码?

请注意:我想检查每个级别的父节点。 parent 是 parent 中的最后一个,祖 parent 是祖 parent 中的最后一个,等等。

为了清楚起见,我这样使用它:
<xsl:choose>
<xsl:when test="count(parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)">
<!-- show image A -->
</xsl:when>
<xsl:otherwise>
<!-- show image B -->
</xsl:otherwise>
</xsl:choose>

最佳答案

<xsl:when test="count(parent::*/preceding-sibling::*)+1 = count(parent::*/parent::*/*)">

可以简化为:
<xsl:when test="not(../following-sibling::*)">

用简单的英语“我的 parent 没有跟随元素兄弟”。

这很容易修改为:
<xsl:when test="not(../../following-sibling::*)">

用简单的英语“我 parent 的 parent 没有以下元素 sibling ”。等等。

同时检查所有祖先:
<xsl:when test="not(ancestor::*/following-sibling::*)">

用简单的英语来说,“我的祖先中没有一个有以下元素 sibling ”。

同时检查 parent 和祖 parent :
<xsl:when test="not(ancestor::*[position() &lt;= 2]/following-sibling::*)">

用简单的英语来说,“我的两个最亲近的祖先中没有一个有以下元素 sibling ”。

编辑 要单独检查所有祖先,可以使用递归模板(优点:内部 <xsl:apply-templates> 的位置决定了您是否有效地在祖先列表中上升或下降):
<xsl:template match="*" mode="line-img">
<xsl:if test="following-sibling::*">
<!-- show image A -->
</xsl:if>
<xsl:if test="not(following-sibling::*)">
<!-- show image B -->
</xsl:if>
<xsl:apply-templates select=".." mode="line-img" />
</xsl:template>

<!-- and later... -->

<xsl:apply-templates select=".." mode="line-img" />

...或一个简单的 for-each 循环(始终按文档顺序工作):
<xsl:for-each select="ancestor::*">
<xsl:if test="following-sibling::*">
<!-- show image A -->
</xsl:if>
<xsl:if test="not(following-sibling::*)">
<!-- show image B -->
</xsl:if>
</xsl:for-each>

...或者,完全地道(总是按文档顺序工作):
<xsl:template match="*" mode="line-img">
<xsl:if test="following-sibling::*">
<!-- show image A -->
</xsl:if>
<xsl:if test="not(following-sibling::*)">
<!-- show image B -->
</xsl:if>
</xsl:template>

<!-- and later... -->

<xsl:apply-templates select="ancestor::*" mode="line-img" />

关于xslt - 使用 XPath 和 XSLT 检查任何级别的父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com