Re: [xsl] Numbering new nodes using consecutive integers

Subject: Re: [xsl] Numbering new nodes using consecutive integers
From: Michael Ludwig <mlu@xxxxxxxxxxxxx>
Date: Fri, 27 Mar 2009 18:53:32 +0100
David Carlisle schrieb:
you don't need xsl:number here as you're doing all the grouping by
hand so the number you want is I think
      <xsl:attribute name="no">
         <xsl:value-of select="position()+ ceiling(count(../preceding-sibling::G1/M) div $M-per-G2) "/>
       </xsl:attribute>

Thanks. However, this doesn't guarantee unique numbers. By increasing M-per-G2 to 12 and adding some <G1> elements:

    ...
    <M>zwvlf</M>
  </G1>
  <G1><!-- new groups from here -->
    <M>usw</M>
  </G1>
  <G1>
    <M>usw</M>
  </G1>
  <G1>
    <M>usw</M>
  </G1><!-- three new groups -->
</Groups>

And then modifying my template:

  <xsl:template match="M" mode="group">
    <G2><!-- I want this GR to be numbered sequentially. -->
      <xsl:attribute name="no">
        <xsl:number level="any"/>
      </xsl:attribute>
      <xsl:attribute name="david">
        <xsl:value-of select="
          position() +
          ceiling( count(../preceding-sibling::G1/M) div $M-per-G2)"/>
      </xsl:attribute>
      <xsl:copy-of select="
        . | following-sibling::M[position() &lt; $M-per-G2]"/>
    </G2>
  </xsl:template>

I get a wrong result (see below).

There is a certain tedium to the problem. I thought there might be a
standard idiom to sequentially number the result tree. Wendell probably
suggested it: Do it in two passes.

Michael Ludwig

<?xml version="1.0" encoding="iso-8859-1"?>
<Groups>
  <G1>
    <G2 no="1" david="1">
      <M>eins</M>
      <M>zwei</M>
      <M>drei</M>
      <M>vier</M>
      <M>f|nf</M>
      <M>sechs</M>
      <M>sieben</M>
    </G2>
  </G1>
  <G1>
    <G2 no="8" david="2">
      <M>acht</M>
      <M>neun</M>
      <M>zehn</M>
      <M>elf</M>
      <M>zwvlf</M>
    </G2>
  </G1>
  <G1>
    <G2 no="13" david="2">
      <M>usw</M>
    </G2>
  </G1>
  <G1>
    <G2 no="14" david="3">
      <M>usw</M>
    </G2>
  </G1>
  <G1>
    <G2 no="15" david="3">
      <M>usw</M>
    </G2>
  </G1>
</Groups>

Current Thread