2016-04-06 7 views
0

Ok Ich versuche eine Tabelle zu erstellen, aber ich mache das nicht richtig, ich habe kein XSL-Beispiel, da nichts, was ich ausprobiert habe, nah an dem war, was ich brauche. (Ich habe versucht mit xsl: apply-templates Schleifen, sogar mit Modi, und sogar xsl: for-each und key() aber kann nicht die richtigen Filter.XSL Gruppierung von Knoten durch mehrere ähnliche Geschwister mit mehreren ähnlichen unbekannten Werten

Hier ist ein Beispiel für die XML, die ich verwenden würde So tun

<report> 
<item> 
    <vertical> 
    <component> 
    <partname>Left Side</partname> 
    <parttype>Side</parttype> 
    <partlocation>Outside</partlocation> 
    <material>Wood</material> 
    <thickness>20mm</thickness> 
    <colour>White</colour> 
    </component> 
    </vertical> 
    <vertical> 
    <component> 
    <partname>Right Side</partname> 
    <parttype>Side</parttype> 
    <partlocation>Outside</partlocation> 
    <material>Wood</material> 
    <thickness>20mm</thickness> 
    <colour>White</colour> 
    </component> 
    </vertical> 
    <vertical> 
    <component> 
    <partname>Back</partname> 
    <parttype>Back</parttype> 
    <partlocation>Inside</partlocation> 
    <material>Plastic</material> 
    <thickness>3mm</thickness> 
    <colour>Black</colour> 
    </component> 
    </vertical> 
</item> 
</report> 

die Aufgabe, die ich will mich an (dieses unter komplexer bin mit ist dann der eigentliche xml I), for-each <item> muss ich machen einen Tisch starten. , und innerhalb dieser Tabelle Ich muss jede <component> zu finden, wie viele haben die gleiche <material>, <thickness> und <colour>. Dann muss ich listet den Materialnamen und die Details auf. Next Ich brauche alle <components>, die die gleiche <parttypes> und <partlocation> haben, die <material>, <thickness> desselben sind und <colour>, ihre <partname> für jeden in einer Reihe zu zeigen. Es gibt keine feste Menge an Materialien, die ich erwarten kann, einmal könnte ich 1 bekommen, ein anderes Mal könnte ich 3 bekommen. Und ich werde nicht immer wissen, welche Werte die Knoten enthalten. auch in jedem <item> kann ich 1-3 verschiedene <parttype> und <partlocation> (althought sie paarweise arbeiten - und ich weiß, was die Werte dieser Knoten sein wird)

Hier ist ein Beispiel des formatierten Oberfläche die wirklich einfach gegeben obiger Code ...

Wood, 20mm, White 
Left Side 
Right Side 

Plastic, 3mm, Black 
Back 

diese Frage ist sehr ähnlich, aber nicht ganz ... xsl grouping of repetitive nodes by xml element in xslt1

Antwort

1

Sie können versuchen, diesen Schlüssel basierte Lösung als eine erste Idee zu verwenden:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" /> 
    <!-- Define keys --> 
    <xsl:key name="kmaterial" match="component" 
      use="concat (generate-id(../..), '|', material, '|', thickness, '|', colour)"/> 
    <xsl:template match="text()" /> 
    <xsl:template match="item"> 
     <xsl:for-each 
       select="vertical/component[ 
        generate-id(.) = 
        generate-id(key('kmaterial', concat (generate-id(../..), '|', material, '|', thickness, '|', colour))[1]) ]"> 

      <xsl:variable name="this" select="."/> 
      <xsl:value-of select="material"/>, <xsl:value-of select="thickness"/> , <xsl:value-of select="colour"/> 
      <xsl:text>&#10;</xsl:text> 
      <xsl:for-each 
         select="key('kmaterial', concat (generate-id(../..), '|', $this/material, '|', $this/thickness, '|', $this/colour))" > 
       <xsl:value-of select="partname"/> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:for-each> 

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

Mit der folgenden Ausgabe:

Wood, 20mm , White 
Left Side 
Right Side 
Plastic, 3mm , Black 
Back 
+0

Danke für den Input hr_117, habe ich mit diesem Vorschlag in meiner aktuellen Datei zu spielen, um zu sehen, ob ich es machen kann tun, was erforderlich ist, aber ich fürchte, es könnte nur die Hälfte der Aufgabe sein. –

+0

Um auch (nächsten Schritt) nach 'parttypes' und' partlocation' zu gruppieren, benötigen Sie einen zweiten Schlüssel (z. B. kmmaterialpart). Das sollte genauso sein wie 'kmaterial' um' '', parttypes' | ', partlocation' erweitert werden. –

+0

Ich habe mir das endlich genau angeschaut und nach ein bisschen Mischen, damit es in meinem eigentlichen Projekt funktioniert Die erste Stufe dieser Antwort hat definitiv mein Dilemma gelöst, ich hatte immer Probleme mit Key() und versuchte es ein wenig besser zu verstehen. Danke @ hr_117 –

Verwandte Themen