別のアプローチは、最初のイチジク要素を一致させることから始めることです
<xsl:apply-templates select="fig[1]"/>
次に、 fig要素に一致するメインテンプレートがありますが、「インクリメント」値を保持するパラメーターがあります。名前付きテンプレートとしても機能することに注意してください。
<xsl:template match="fig" name="fig">
<xsl:param name="sequence" select="1"/>
この中で、 fignum要素を出力できます
<fignum>
<xsl:value-of
select="concat(substring-before(substring(@xml:id, 2, string-length(@xml:id) - 1), '-'), '.', $sequence)"/>
</fignum>
次に、次のfig要素を照合し、パラメーターの値をインクリメントします
<xsl:apply-templates select="following-sibling::fig[1]">
<xsl:with-param name="sequence" select="$sequence + 1"/>
</xsl:apply-templates>
シーケンスをリセットするには、関連する属性を持つfig要素に一致するテンプレートがあり、属性値を指定してnamed-templateを呼び出してオーバーライドできます。
<xsl:template match="fig[@resumeatnum != '']">
<xsl:call-template name="fig">
<xsl:with-param name="sequence" select="@resumeatnum"/>
</xsl:call-template>
</xsl:template>
これが完全なXSLTです
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="comp">
<comp>
<xsl:apply-templates select="fig[1]"/>
</comp>
</xsl:template>
<xsl:template match="fig[@resumeatnum != '']">
<xsl:call-template name="fig">
<xsl:with-param name="sequence" select="@resumeatnum"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="fig" name="fig">
<xsl:param name="sequence" select="1"/>
<fig>
<xsl:apply-templates select="@*"/>
<fignum>
<xsl:value-of select="concat(substring-before(substring(@xml:id, 2, string-length(@xml:id) - 1), '-'), '.', $sequence)"/>
</fignum>
</fig>
<xsl:apply-templates select="following-sibling::fig[1]">
<xsl:with-param name="sequence" select="$sequence + 1"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
サンプルXMLに適用すると、次のように出力されます。
<comp>
<fig xml:id="c1-fig-001">
<fignum>1.1</fignum>
</fig>
<fig xml:id="c1-fig-002">
<fignum>1.2</fignum>
</fig>
<fig xml:id="c1-fig-003">
<fignum>1.3</fignum>
</fig>
<fig xml:id="c1-fig-004" resumeatnum="7">
<fignum>1.7</fignum>
</fig>
<fig xml:id="c1-fig-005">
<fignum>1.8</fignum>
</fig>
<fig xml:id="c1-fig-006">
<fignum>1.9</fignum>
</fig>
<fig xml:id="c1-fig-007" resumeatnum="18">
<fignum>1.18</fignum>
</fig>
<fig xml:id="c1-fig-008">
<fignum>1.19</fignum>
</fig>
<fig xml:id="c1-fig-009">
<fignum>1.20</fignum>
</fig>
</comp>