Question

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.
Was it helpful?

Solution 2

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>

OTHER TIPS

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>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top