如何表达xpath 1.0计数功能?

时间:2016-10-11 16:51:45

标签: xpath

我有一个类似下面的文档,我需要从其父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

有没有办法实现这个目标?

1 个答案:

答案 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>