gruppieren
Karsten T.
- xsl
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>
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 .....)
Du musst immer dafür sorgen, dass der key für die nächste Untergruppe die elemente aus der Obergruppe berücksichtigt.
(Du kannst auf die '+' im concat() auch verzeichten und die Sortierung bei translate(., 'ABCD...', '') muss du ergänzen).
<xsl:key name="refName" match="element" use="name"/>
<xsl:key name="refHausnummer" match="element" use="concat(name, '+', hausnummer)"/>
<xsl:key name="refType" match="element" use="concat(name, '+', hausnummer, '+', typ)"/>
<xsl:key name="refSubtype" match="element" use="concat(name, '+', hausnummer, '+', typ, '+', Subtype)"/>
<xsl:template match="/root">
<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:value-of select="concat('Name: ',name)"/><br />
<xsl:for-each select="key('refName',name)[generate-id() = generate-id(key('refHausnummer', concat(name, '+', hausnummer))[1])]">
<xsl:sort data-type="number" select="translate(hausnummer, 'ABCDEF', '')"/>
<xsl:sort data-type="text" select="translate(hausnummer, '1234567890', '')"/>
 <xsl:value-of select="concat('Hausnummer: ',hausnummer) "/><br />
<xsl:for-each select="key('refHausnummer', concat(name, '+', hausnummer))[generate-id() = generate-id(key('refType', concat(name, '+', hausnummer, '+', typ))[1])]">
   <xsl:value-of select="concat('Type: ', typ) "/><br />
<xsl:for-each select="key('refType', concat(name, '+', hausnummer, '+', typ))[generate-id() = generate-id(key('refSubtype', concat(name, '+', hausnummer, '+', typ, '+', Subtype))[1])]">
     <xsl:value-of select="concat('Subtype: ',Subtype)"/><br />
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
<br />
</xsl:for-each>
</xsl:template>
ErRgibt so etwas:
Name: Dieter
Hausnummer: 10A
Type: A
Subtype: B
Hausnummer: 10B
Type: A
Subtype: B
Name: Hans
Hausnummer: 10
Type: C
Subtype: B
Type: D
Subtype: B
Hausnummer: 10A
Type: A
Subtype: B
Hausnummer: 20
Type: D
Subtype: B
Hausnummer: 100
Type: D
Subtype: B
Grüße
Thomas
Hallo Thomas,
ja, es hat klick, klick gemacht, dank deiner Hilfe. Ob es wirklich nach meinen Wuenschen funktioniert, kann ich erst heute abend testen, aber schon mal vielen Dank, das mit dem '+' bei concat() ist mir neu.
Gruß, K.
Hallo,
ja, es hat klick, klick gemacht, dank deiner Hilfe. Ob es wirklich nach meinen Wuenschen funktioniert, kann ich erst heute abend testen, aber schon mal vielen Dank, das mit dem '+' bei concat() ist mir neu.
Du kannst jedes andere Zeichen nehmen, bzw. es weglassen, ich habe es nur genommen, um damit die Verbindung von einer Gruppe zu einer anderen zu veranschaulichen.
Grüße
Thomas