前面元素的计数忽略一个节点

时间:2015-04-23 12:41:00

标签: xslt xslt-2.0

我是以下的XML。

<nd>
            <fn>
                <fnn>*</fnn>
                <fnt>
                    <p>
                        <i>ftn 1</i>
                    </p>
                </fnt>
            </fn>
            <ti>
                <fn>
                    <fnn>*</fnn>
                    <fnt>
                        <p>
                            <i>ftn 1</i>
                        </p>
                    </fnt>
                </fn>
            </ti>
            <tx>
                <fn>
                    <fnn>1</fnn>
                    <fnt>
                        <p>
                            <i>ftn2</i>
                        </p>
                    </fnt>
                </fn>
                <fn>
                    <fnn>2</fnn>
                    <fnt>
                        <p>
                            <i>ftn3</i>
                        </p>
                    </fnt>
                </fn>
            </tx>
        </nd>

在这里,我想计算前面的fnn并创建脚注,但在这里我想要进入preceding::tx。我使用下面的XSLT。

  <xsl:template match="/">
      <hmtl>
        <head>
          <title>New Version!</title>
        </head>
        <xsl:apply-templates/>
            <xsl:if test="//fnn">
                    <section class="tr_footnotes">
                        <xsl:text disable-output-escaping="yes"><![CDATA[<hr />]]></xsl:text>
                        <xsl:apply-templates select="//page|//fnt" mode="footnote"/>
                    </section>
                </xsl:if>
      </hmtl>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="fnn">
            <xsl:variable name="count" select="count(preceding::fnn)"/>
        <xsl:variable name="varHeaderNote" select='concat("f",$count)'/>
        <xsl:variable name="varFootNote" select='concat("#ftn.",$count)'/>
        <sup>
            <a name="{$varHeaderNote}" href="{$varFootNote}" class="tr_ftn">
                <xsl:value-of select="."/>
            </a>
        </sup>
    </xsl:template>
        <xsl:template match="ti"/>

    <xsl:template match="fnt" mode="footnote">
        <xsl:variable name="count" select="count(preceding::fnn)"/>
        <div class="tr_footnote">
            <div class="footnote">
                <sup>
                    <a>
                        <xsl:attribute name="name"><xsl:text>ftn.</xsl:text><xsl:value-of select="$count"/></xsl:attribute>
                        <xsl:attribute name="href"><xsl:text>#f</xsl:text><xsl:value-of select="$count"/></xsl:attribute>
                        <xsl:attribute name="class"><xsl:text>tr_ftn</xsl:text></xsl:attribute>
                        <xsl:value-of select="$count"/>
                    </a>
                </sup>
                <xsl:apply-templates/>
            </div>
        </div>
    </xsl:template>

我可以使用ti来忽略<xsl:template match="ti"/>,但是在计数中它正在考虑fnnti,我想忽略它并计数。在脚注部分,我无法忽视它。

这里是头部。

ftn.0生成ftn.2后,我希望这是ftn 1

在脚注部分中有ftn.1ftn.2(这是ti的脚注),这应该被忽略。

请让我知道如何解决这个问题。

以下是working Demo

感谢。

1 个答案:

答案 0 :(得分:0)

我认为您可以通过以下方式更改计数器:

<xsl:variable name="count" select="count(preceding::fnn[not(ancestor::ti)])"/>