user3376375
user3376375

Reputation: 7

how to create a numbered list xsl

my xml

  <section>
  <orderedlist>
      <listitem>
        <para>Lorem ipsum dolor sit amet, consectetur adipisicing elit,
        sed do eiusmod tempor incididunt ut labore et dolore magna
        aliqua.</para>
      </listitem>

      <listitem>
        <para>Ut enim ad minim veniam, quis nostrud exercitation ullamco
        laboris nisi ut aliquip ex ea commodo consequat.</para>
      </listitem>

      <listitem>
        <para>Duis aute irure dolor in reprehenderit in voluptate velit
        esse cillum dolore eu fugiat nulla pariatur.</para>
      </listitem>

      <listitem>
        <para>Excepteur sint occaecat cupidatat non proident, sunt in
        culpa qui officia deserunt mollit anim id est laborum.</para>
      </listitem>
 </orderedlist>
 </section>

my xls

<xsl:stylesheet version = '1.0' 
 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="listitem/para">
 <ol>
  <xsl:for-each select="//para">
   <li>
    <xsl:value-of select="."/>
   </li>
 </ol> 
</xsl:template>
</xsl:stylesheet>

In output I get 4 copies, but I want only one. What is wrong?

  1. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  2. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  3. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
  4. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Upvotes: 0

Views: 1610

Answers (2)

Daniel Haley
Daniel Haley

Reputation: 52888

You're creating a separate ol for every listitem/para in the document. Create the ol at the orderedlist level and then create the li at each para.

Example:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="listitem/para">
        <li><xsl:apply-templates/></li>
    </xsl:template>

</xsl:stylesheet>

Upvotes: 0

vittore
vittore

Reputation: 17589

Your template has template tag that would match 4 times as you have 4 tags , and after that //para will return 4 tags as it looks in the whole document. I believe you wanted this:

<xsl:template match="listitem">
 <ol>
  <xsl:for-each select="para">
    <li>
   <xsl:value-of select="."/>
   </li>
  </ol> 
  </xsl:template>
</xsl:stylesheet>

Upvotes: 1

Related Questions