我有一个类似下面的文档,我需要从其父subitem[@role="special"]
开始计算每个item
。
我的问题是我需要计算subitem
的数字以及subitems
中任何嵌套 subitem
的相同值。因此对于作为subitems
后代的所有subitem[@role="special"]
,我应该始终获得相同的值。我已使用(want N)
<root>
<item role="special">
<name>One</name>
<subitem>
<name>A (want 0)</name>
</subitem>
</item>
<item>
<name>Two</name>
<subitem role="special">
<name>B (want 1)</name>
<subitem>
<name>B b (want 1)</name>
</subitem>
</subitem>
<subitem>
<name> C (want 0)</name>
<subitem>C c (want 0)</subitem>
</subitem>
<subitem role="special">
<name> D (want 2)</name>
<subitem>
<name>D d (want 2)</name>
</subitem>
</subitem>
</item>
</root>
这些是我尝试过的事情,但我开始怀疑我的想法是否可能:
<xsl:template match="subitem">
<xsl:value-of select="count(ancestor-or-self::subitem[@role='special'])"/>
<xsl:value-of select="count(preceding-sibling::subitem[@role='special'])"/>
<xsl:text>
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
本身会返回:
00
10
10
01
00
11
10
有没有办法实现这个目标?
答案 0 :(得分:1)
如果我理解正确,你有三种情况:当前的子项本身是特殊的,或者是特殊项目的后代,或者不是特殊的。然后我们可以使用选择条件并根据情况处理每个案例:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="subitem">
<xsl:choose>
<xsl:when test="@role='special'">
<xsl:value-of select="count(preceding-sibling::subitem[@role='special'])+1" />
</xsl:when>
<xsl:when test="ancestor::subitem[@role='special']">
<xsl:value-of select="count(preceding::subitem[@role='special'])+1" />
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
<xsl:text>
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>