Karsten T.: gruppieren

Beitrag lesen

Hallo,

ich muss seit langem mal wieder auf xslt1.0 zurueckgreifen, da für das projekt nicht xslt2.0 verfügbar ist. nun habe ich ein gruppierungsproblem, zum einen unterschlägt es mir einige knotenausgaben und zum anderen suche ich nach einer möglichkeit kombinationen aus zahl und nachfolgender zahl zu sortieren, z.B. liegen mir die hausnummern als 100, 1, oder 10A bzw. 100A, 200, 20b. Diese muesste ich sortieren koenen nach Hausnummer und dann der Zusatz (1,10A,100,100A .....)

Würde mich über Ratschläge freuen. Gruß, K.

meine xml sieht skizzenhaft so aus:

<root>
 <element>
  <name>Hans</name>
  <hausnummer>10A</hausnummer>
  <typ>A</typ>
  <Subtype>B</Subtype>
 </element>
 <element>
  <name>Hans</name>
  <hausnummer>10</hausnummer>
  <typ>C</typ>
  <Subtype>B</Subtype>
 </element>
 <element>
  <name>Hans</name>
  <hausnummer>10</hausnummer>
  <typ>D</typ>
  <Subtype>B</Subtype>
 </element>
 <element>
  <name>Hans</name>
  <hausnummer>10</hausnummer>
  <typ>D</typ>
  <Subtype>B</Subtype>
 </element>
 <element>
  <name>Dieter</name>
  <hausnummer>10A</hausnummer>
  <typ>A</typ>
  <Subtype>B</Subtype>
 </element>
</root>

Ich moechte nun dies so auswerten, dass zuerst nach dem namen gruppiert werden soll. es soll dann der weiter gruppiert werden für alle nach hausnummer, type Subtype usw. Als Ausgabe soll dann etwa erscheinen

Name:Hans
 Hausnummer:10
  Type: C
   Subtype: B
  Type: D
   Subtype: B
 Hausnummer:10A
  Type: A
   Subtype: B
Name:Dieter
 Hausnummer: 10A
  Type: A
   Subtype: B

Mein versuch mit folgender xsl unterschlägt scheinbar einige knoten, womein fehler liegt weiss ich nicht ganz

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="html" indent="yes"/>
 <xsl:key name="refName" match="root/element" use="name"/>
 <xsl:key name="refHausnummer" match="root/element" use="hausnummer"/>
 <xsl:key name="refType" match="root/element" use="type"/>
 <xsl:key name="refSubtype" match="root/element" use="Subtype"/>
 <xsl:template match="/">
   <xsl:for-each select="element[generate-id() = generate-id(key('refName', name)[1])]">
   <xsl:sort select="name" case-order="lower-first" data-type="text"/>
     <xsl:for-each select="key('refName',name)[generate-id() = generate-id(key('refHausnummer', hausnummer)[1])]">

<xsl:value-of select="concat('Name: ',name)/>
.
      <xsl:for-each select="key('refHausnummer',hausnummer)[generate-id() = generate-id(key('refType', type)[1])]">
.
<xsl:value-of select="concat('Hausnummer: ',hausnummer)/>

</xsl:for-each>
.

</xsl:for-each>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>