Thomas J.S.: Frage zum Sortieren mit XSL

Beitrag lesen

Hallo,

danke für den Rang. Der Counter soll nichts anderes tun, als die ebene zu bestimmen.

Vielleicht wird es so etwas deutlicher

<root>
<name att="untertitel"/>

<root>
<einheit att1="untertitel" att2="unteruntertitel1" rang="1"/>

Ja, das ergibt mehr Sinn.

Also der Counter mach nichts anderes, als rekursive die ebene (stufe) zu bestimmen. Mir fällt kein anderer Weg ein.

0_titel
1_1_untertitel
2_1_unteruntertitel1
2_2_unteruntertitel2

Da wäre ein count() ganz sinnvoll:
-----------------------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
 <html>
  <head>
   <title>Untitled</title>
  </head>
  <body>
   <xsl:for-each select="name">
    <xsl:sort select="count(document('temp1.xml')/root/einheit[@att1=current()/@att])" data-type="number" />
    <xsl:sort select="document('temp1.xml')/root/einheit[@att2=current()/@att]/@rang" data-type="number" />
    <xsl:variable name="rang" select="document('temp1.xml')/root/einheit[@att2=current()/@att]/@rang"/>
    <xsl:variable name="stufe">
     <xsl:call-template name="stufe_ermitteln">
      <xsl:with-param name="att_uebergabe" select="@att"/>
     </xsl:call-template>
    </xsl:variable>

<!-- Ausgabe der Stufe und Rang und Bezeichnung -->
    <xsl:value-of select="$stufe"/>
    xsl:text_</xsl:text>
    <xsl:value-of select="$rang"/>
    xsl:text_</xsl:text>
    <xsl:value-of select="@att"/>
    <br/>
   </xsl:for-each>
  </body>
 </html>
</xsl:template>
<xsl:template name="stufe_ermitteln">
 <xsl:param name="att_uebergabe"/>
 <xsl:param name="counter" select="1"/>
 xsl:choose
  <xsl:when test="not(document('temp1.xml')/root/einheit[@att1=$att_uebergabe])">
   <xsl:value-of select="$counter"/>
  </xsl:when>
  xsl:otherwise
   <xsl:call-template name="stufe_ermitteln">
    <xsl:with-param name="att_uebergabe" select="document('temp1.xml')/root/einheit[@att2=$att_uebergabe]/@att1"/>
    <xsl:with-param name="counter" select="$counter + 1"/>
   </xsl:call-template>
  </xsl:otherwise>
 </xsl:choose>
</xsl:template>
</xsl:stylesheet>
-------------------------------

meine Ausgabe ist:
1_1_unteruntertitel1
1_2_unteruntertitel2
2__titel
3_1_untertitel

Falls das count() nicht ausreichend ist, wäre eine Gruppierung mit key() sinnvoll.

Grüße
Thomas