Karsten T.: gruppieren

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>

  1. 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', '')"/>  
        &#160;<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])]">  
         &#160;&#160;&#160;<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])]">  
          &#160;&#160;&#160;&#160;&#160;<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

    1. 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.

      1. 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