0

一連のステップを含む XML があります。タイトルが発生したときにステップ番号をリセットしようとしています。

  • 各ステップには、1 つ以上の「para」要素が含まれます。

  • 各ステップには、必要に応じて「タイトル」要素を 1 つ含めることができます。

  • 各ステップは連続した番号を受け取る必要がありますが、タイトルが発生すると、ステップの番号付けが再開されます。

これは、XSLT 1.0/XSL:FO を使用して達成する必要があります。

XML :

<top>
    <Step>
        <title>Toilet Paper Holder</title>
        <para>It holds toilet paper.</para>
        <para>It holds 1 roll.</para>
    </Step>
    <Step>
        <para>It is red.</para>
    </Step>
    <Step>
        <para>It is metal.</para>
    </Step>
    <Step>
        <title>Toilet</title>
        <para>You sit on it.</para>
    </Step>
    <Step>
        <para>It is white.</para>
    </Step>
    <Step>
        <para>It is porcelain.</para>
    </Step>
</top>

XSL :

<xsl:template match="Step">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="title">
    <fo:block>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

<xsl:template match="para">
    <fo:block>
        <xsl:if test="not(preceding-sibling::para)">
            <xsl:number count="Step[child::para]" from="top" format="1."/>
        </xsl:if>
        <xsl:text> </xsl:text>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

現在の出力:

Toilet Paper Holder
1. It holds toilet paper.
It holds 1 roll.
2. It is red.
3. It is metal.
Toilet
4. You sit on it.
5. It is white.
6. It is porcelain.

望ましい出力:

Toilet Paper Holder
1. It holds toilet paper.
It holds 1 roll.
2. It is red.
3. It is metal.
Toilet
1. You sit on it.
2. It is white.
3. It is porcelain.
4

1 に答える 1

0

これは、目的の出力を生成するための xslt です。

XSL:

<xsl:template match="Step">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="title">
    <fo:block>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

<xsl:template match="para">
    <fo:block>
        <xsl:if test="not(preceding-sibling::para)">
            <xsl:call-template name="StepNumbering">
                <xsl:with-param name="format" select="'1.'"/>
            </xsl:call-template>
        </xsl:if>
        <xsl:text> </xsl:text>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

<xsl:template name="StepNumbering">
    <xsl:param name="format" select="'1.'"/>
    <xsl:for-each select="parent::Step">
        <xsl:choose>
            <xsl:when test="title">
                <xsl:number value="1" format="{$format}"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="Step_id">
                    <xsl:for-each select="preceding-sibling::Step[title][1]">
                        <xsl:value-of select="generate-id(.)"/>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:variable name="StepNumber" 
                select="count(preceding-sibling::Step
                [generate-id(preceding-sibling::Step[title][1]) = $Step_id] 
                | preceding-sibling::Step[title][1])+1"/>
                <xsl:number value="$StepNumber" format="{$format}"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>
于 2012-06-12T19:43:17.140 に答える