Mobby: XML Einträge Gruppieren

Hallo, ich würde gern eine XML über ein XSL-Stylesheet gruppieren. Dies ist die Ur-Version:

<?xml version="1.0" encoding="UTF-8" ?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ROW>
<Hauptartikel>Rot</Hauptartikel>
<Bezeichnung>XX1</Bezeichnung>
<Text>XX2</Text>
<Plan>XX3</Plan>
</ROW>
<ROW>
<Hauptartikel>Rot</Hauptartikel>
<Bezeichnung>XX12</Bezeichnung>
<Text>XX22</Text>
<Plan>XX32</Plan>
</ROW>
<Hauptartikel>Gelb</Hauptartikel>
<Bezeichnung>XX22</Bezeichnung>
<Text>XX32</Text>
<Plan>XX42</Plan>
</ROW>
<Hauptartikel>Gelb</Hauptartikel>
<Bezeichnung>XX32</Bezeichnung>
<Text>XX42</Text>
<Plan>XX52</Plan>
</ROW>
</FMPDSORESULT>

Das Ergebnis soll dann so aussehen:

<?xml version="1.0" encoding="UTF-8" ?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ROW>
<Hauptartikel>Rot</Hauptartikel>
	<ROW2>
	<Bezeichnung>XX1</Bezeichnung>
	<Text>XX2</Text>
	<Plan>XX3</Plan>
	</ROW2>
	<ROW2>
	<Bezeichnung>XX12</Bezeichnung>
	<Text>XX22</Text>
	<Plan>XX32</Plan>
	</ROW2>
</ROW>
<ROW>
<Hauptartikel>Gelb</Hauptartikel>
	<ROW2>
	<Bezeichnung>XX22</Bezeichnung>
	<Text>XX32</Text>
	<Plan>XX42</Plan>	
	</ROW2>
	<ROW2>
	<Bezeichnung>XX32</Bezeichnung>
	<Text>XX42</Text>
	<Plan>XX52</Plan>
	</ROW2>
</ROW>
</FMPDSORESULT>

Könnt ihr da helfen? Mit xsl:for-each-group komme ich leider nicht klar.

Danke und beste Grüße

  1. Hallo Mobby,

    probiere diesen Ansatz:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xpath-default-namespace="http://www.filemaker.com/fmpdsoresult"
      xmlns="http://www.filemaker.com/fmpdsoresult">
    
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
      <xsl:template match="FMPDSORESULT">
        <FMPDSORESULT>
          <xsl:for-each-group select="ROW" group-by="Hauptartikel">
            <xsl:for-each select="current-group()[1]">
              <ROW>
                <Hauptartikel>
                  <xsl:value-of select="Hauptartikel"/>
                </Hauptartikel>
                <xsl:for-each select="current-group()">
                  <ROW2>
                    <xsl:copy-of select="Hauptartikel/following-sibling::*"/>
                  </ROW2>
                </xsl:for-each>
              </ROW>
            </xsl:for-each>
          </xsl:for-each-group>
        </FMPDSORESULT>
      </xsl:template>
    
    </xsl:stylesheet>
    
    

    Grüße,
    Thomas

    1. Danke. Ich werde mal daran testen. So bekomme ich keine Ausgabe.

      1. Hallo Mobby,

        es entsteht exakt die gewünschte Ausgabe. Das setzt natürlich einen XSLT-2.0-Prozessor voraus (xsl:for-each-group ist eine 2.0-Technik). Saxon-HE bietet sich an.

        Grüße,
        Thomas

        1. Achso... Ich habe nur im Dreamweaver gecodet und im Browser getestet.

        2. Mal eine Verständnisfrage. Wenn ich auf meinen System Saxon-HE habe, die XML/XSLT weitergebe, kann derjenige nicht wirklich etwas damit anfangen?

          --
          Viele Grüße Mobby
          1. Hallo Mobby,

            zur Weitergabe der Transformation die saxon9he.jar mitliefern (Java-VM auf dem Zielsystem vorausgesetzt). Dann eine Batch-Datei (oder Shellscript) zum Aufruf im selben Verzeichnis hinzufügen, etwa run.cmd:

            java -jar saxon9he.jar -s:name.xml -xsl:name.xsl -o:name.xyz

            oder etwas komfortabler:

            @echo off
            
            rem Ausgangs- und Ergebnisdokumente:
            set xmlfile="name.xml"
            set xslfile="name.xsl"
            set outfile="name.xyz"
            
            rem XSLT-Prozessor (ggf, voller Pfad):
            set xsltprz="saxon9he.jar"
            
            rem Ausführung:
            java -jar %xsltprz% -s:%xmlfile% -xsl:%xslfile% -o:%outfile%
            
            rem Ergebnis anzeigen (und Fenster mit Taste schließen):
            pause
            
            

            Grüße,
            Thomas

            1. Danke für die ausführliche Antwort. Leider bin ich an der Stelle dann doch raus... ;-)

              --
              Viele Grüße Mobby
              1. Hallo Mobby,

                kann doch nicht so schwierig sein: saxon9he.jar aus dem genannten Archiv entpacken und Batchskript run.cmd in der genannten Form bauen, also die drei Dateinamen anpassen.

                Dann reicht zum Transformieren Doppelklick auf run.cmd (kann man auch als Desktopverknüpfung ablegen) und in der Ausgabedatei liegt das Ergebnis.

                Prüfen, ob Java bereit ist: Win-Taste + R —> cmd (oder Terminal etc.)

                java -version
                
                C:\Users\User>java -version
                java version "1.8.0_121"
                Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
                Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
                

                Grüße,
                Thomas

                1. Moin, an sich nicht das Problem. Ich muss die XML und XSL an weitere Stellen weiter geben, die dann u.a. in InDesign weiterverarbeitet werden sollen. Die können damit dann ohne saxon nix anfangen können. Und denen dann erklären, was sie machen sollen...

                  --
                  Viele Grüße Mobby
                  1. Hallo Mobby,

                    ist natürlich bitter, wenn Standardsoftware 10 Jahre nach XSLT 2.0 das nicht umsetzt (3.0 steht gerade ins Haus aka W3C Candidate Recommendation vom 07.02.2017). FrameMaker würde es können, da ist die .NET-Variante von Saxon-HE dabei.

                    Ansonsten mal für XSLT 1.0 mit dem Muenchian grouping befassen. Diesen Knoten möchte man sich aber nicht mehr ins Hirn machen – deshalb ja xsl:for-each-group.

                    Grüße,
                    Thomas

                    1. Deshalb war ich so verwundet, dass es nicht ging. Wollte mich eigentlich nicht mit dem Muenchian grouping beschäftigen ;-), FrameMaker ist doch etwas teuer und leider nicht in der Creativ Cloud mit bei.

                      --
                      Viele Grüße Mobby
                  2. Ich habe ein Skripte mit denen man ein XSLT 2.0 über Saxon in InDesign transformieren kann. Voraussetzung ist natürlich, das Java auf dem Rechner implementiert ist. Das Skript wäre aber leider kostenpflichtig. Bei Interesse einfach melden.