Tobel: Fehlerhafte Nummerierung in XSL

Hallo

Ich wandel eine XML-Datei in eine andere XML-Datei per XSL um. Aus der Quelldatei werden Elemente 1:1 übernommen und dann ein "Nummer"-Attribut hinzugefügt. Die Zieldatei weißt aber nicht erwartete Nummerierung auf:

Quelldatei:
-----------
<root>
 <rumpf>
  <element>
   <absatz>1.1 satz</absatz>
   <absatz>1.2 absatz</absatz>
   <absatz>1.3 absatz</absatz>
   <element>
    <absatz>2.1 absatz</absatz>
    <absatz>2.2 absatz</absatz>
    <absatz>2.3 bsatz</absatz>
    <absatz>2.4 bsatz</absatz>
   </element>
  </element>
  <element>
   <absatz>3.1 absatz</absatz>
   <absatz>3.2 absatz</absatz>
  </element>
 </rumpf>
</root>

Style Sheet:
------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />

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

<xsl:template match="absatz">
  <xsl:variable name="nr">
   <xsl:value-of select="position()"/>
  </xsl:variable>

<absatz nr="{$nr}">
    <xsl:value-of select="text()" />
   </absatz>
 </xsl:template>

</xsl:stylesheet>

Zieldatei:
----------
   <absatz nr="2">1.1 satz</absatz>
   <absatz nr="4">1.2 absatz</absatz>
   <absatz nr="6">1.3 absatz</absatz>

<absatz nr="2">2.1 absatz</absatz>
    <absatz nr="4">2.2 absatz</absatz>
    <absatz nr="6">2.3 bsatz</absatz>
    <absatz nr="8">2.4 bsatz</absatz>

<absatz nr="2">3.1 absatz</absatz>
   <absatz nr="4">3.2 absatz</absatz>

Ich hatte eigentlich folgende Nummerierung erwartet:

<absatz nr="1">1.1 satz</absatz>
   <absatz nr="2">1.2 absatz</absatz>
   <absatz nr="3">1.3 absatz</absatz>

<absatz nr="1">2.1 absatz</absatz>
    <absatz nr="2">2.2 absatz</absatz>
    <absatz nr="3">2.3 bsatz</absatz>
    <absatz nr="4">2.4 bsatz</absatz>

<absatz nr="4">3.1 absatz</absatz>
   <absatz nr="5">3.2 absatz</absatz>

Vielen Dank im voraus!

Tobel

  1. Hallo,

    <xsl:template match="absatz">
       <absatz>
       <xsl:attribute name="nr">
        <xsl:number />
       </xsl:attribute>
        <xsl:value-of select="text()" />
       </absatz>
     </xsl:template>

    Grüße
    Thomas

    1. Vielen Dank! Aber warum zählt position() hier so falsch?

      1. Hallo,

        Vielen Dank! Aber warum zählt position() hier so falsch?

        Er zählt nicht falsch, sondern es werden auch die white-space nodes zwischen den Elementen in die Zählung einbezogen (passiert bei <xsl:apply-templates />) die dann die ungerade Nummern haben.
        Verwendest du strip-space auf "<element>" und/oder <xsl:apply-templates select="absatz" /> sollte position() auch gehen.

        Grüße
        Thomas