2012-06-12 1 views
0

У меня есть XML, который содержит серию шагов. Я пытаюсь сбросить нумерацию шагов, когда заголовок имеет место.XSLT 1.0/XSL: FO - как сбросить нумерацию при возникновении определенного дочернего узла

  • Каждый шаг будет содержать один или несколько элементов «пара».

  • Каждый шаг может необязательно содержать один элемент «title».

  • Каждый шаг должен иметь последовательный номер, однако при появлении заголовка нумерация шагов должна перезапускаться.

Это должно быть выполнено с использованием 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. 

ответ

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>