Announcement

Collapse
No announcement yet.

Probleme mit Gruppierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Gruppierung

    Hallo,
    ich bin gerade dabei ein XSL zur Umwandlung von XML-Daten, die aus einer Datenbank kommen zu schreiben.
    Eigentlich dachte ich ja, dass es nicht so schwierig ist, aber zur Zeit stehe ich total auf dem Schlauch und komme irgendwie nicht mehr weiter.
    Ich hoffe, dass mir jemand helfen kann.

    Ich scheitere bei folgender Aufgabe:

    Mein Quelldokument sieht in vereinfachter Form so aus:

    Code:
    <Produkt>
    	<Exemplar>
    		<CD>
    			<Person id="1">Krüger</Person>
    			<Person id="2">Müller</Person>
    		</CD>
    		<CD>
    			<Person id="1">Krüger</Person>
    			<Person id="3">Schmidt</Person>
    		</CD>
    	</Exemplar>	
    	<Exemplar>...</Exemplar>
    </Produkt>
    <Produkt>
    	<Exemplar>
    		<CD>
    			<Person id="4">Hermann</Person>
    			<Person id="5">Müllermann</Person>
    		</CD>
    		<CD>
    			<Person id="3">Schmidt</Person>
    			<Person id="5">Müllermann</Person>
    		</CD>
    	</Exemplar>
    	<Exemplar>...</Exemplar>
    	<Exemplar>...</Exemplar>
    </Produkt>
    <Produkt>
    	<Exemplar>
    		<CD>
    			<Person id="4">Hermann</Person>
    			<Person id="5">Müllermann</Person>
    			<Person id="7">Schulze</Person>
    		</CD>
    		<CD>
    			<Person id="6">Meyer</Person>
    			<Person id="5">Müllermann</Person>
    		</CD>
    	</Exemplar>	
    	<Exemplar>...</Exemplar>
    </Produkt>
    Die Ausgabe stelle ich mir so vor:

    Code:
    <Produkt>
    			<Person id="1">Krüger</Person>
    			<Person id="2">Müller</Person>
    			<Person id="3">Schmidt</Person>
    </Produkt>
    <Produkt>
    			<Person id="4">Hermann</Person>
    			<Person id="5">Müllermann</Person>
    			<Person id="3">Schmidt</Person>
    </Produkt>	
    <Produkt>
    			<Person>mehrere Personen</Person>
    </Produkt>
    Das bedeutet, dass alle Personen eines Produktes ausgegeben werden sollen, wobei doppelte Einträge nicht doppelt ausgegeben werden sollen. Dabei soll nur das erste Exemplar betrachtet werden.
    Außerdem soll, wenn die Anzahl der auszugebenden Personen größer als 3 ist "mehrere Personen" ausgegeben werden.

    Leider scheitere ich schon bei der Ausgabe der Personen. Ich habe schon mehreres probiert.

    Hätte jemand eine Idee / einen Ansatz?

    Meine XSL sieht wie folgt aus. Problem ist, dass alle Personen gruppiert werden. Ich brauche aber eine Gruppierung für jedes Produkt. Wie kann man das realisieren?

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:key name="test" match="Person" use="@id"/>
    
    	<xsl:template match="/">
    		<xsl:call-template name="Person"/>
    	</xsl:template>
    	
    	<xsl:template name="Person">
    		<xsl:for-each select="Produkt">
    		<Produkt>
    			<xsl:for-each select="Exemplar[1]/CD/Person[generate-id() = generate-id(key('test',@id)[1])]">
    			<xsl:copy-of select="."/>
    			</xsl:for-each>
    		</Produkt>
    		</xsl:for-each>	
    	</xsl:template>
    
    </xsl:stylesheet>

    Eigentlich kann es doch nicht so schwer sein?!?
    Übrigens verwende ich XSLT 1.0.
    Vielen Dank schon mal im voraus.
    Zuletzt editiert von nipu; 01.07.2009, 14:33.

  • #2
    Hat keiner eine Idee, wie man das Problem lösen könnte? Ich bin für alle Hinweise dankbar. Falls es mit XSLt 1.0 nicht geht, geht es mit XSLT 2.0?

    Comment


    • #3
      Ein 2.0-Ansatz:
      Code:
      <xsl:template match="/">
        <root>
          <xsl:apply-templates select="//Produkt"/>
        </root>
      </xsl:template>
      	
      <xsl:template match="Produkt">
        <Produkt>
          <xsl:for-each-group select="Exemplar/CD/Person" group-by="@id">
            <xsl:for-each select="current-group()[1]">
              <xsl:copy-of select="."/>
            </xsl:for-each>
          </xsl:for-each-group>
        </Produkt>			
      </xsl:template>

      Comment


      • #4
        Vielen Dank für den Ansatz. Ich werde es gleich mal ausprobieren.
        Mich würde dazu noch interessieren, ob dieses Problem auch auf irgendeine Art und Weise mit XSLT 1.0 gelöst werden könnte oder ob so etwas von XSLT 1.0 nicht unterstützt wird?
        Dann müßte ich mich nämlich um einen anderen Prozessor bemühen.

        Comment


        • #5
          Die Gruppierung klappt so prima.
          Das zählen bzw. die Ausgabe bestimmter Positionen bekomme ich aber nicht hin
          Ist das irgendwie möglich die Gruppierungen zu zählen o.ä.?
          Zuletzt editiert von nipu; 03.07.2009, 11:54.

          Comment


          • #6
            position() ist auch innerhalb von xsl:for-each-group zugänglich. Da müsstest Du schon konkreter werden.

            Comment


            • #7
              Ja, damit hatte ich es auch probiert, aber es wurden irgendwie alle Personen der Gruppierung als erste Position ausgegeben.
              Es wird ja auch mit xsl:for-each select="current-group()[1]" nur die erste Position angesprochen.
              Irgendwie hat es nicht geklappt.
              Ich habe das Problem jetzt gelöst, indem ich einfach eine zweite Transformation anschließe und die Umwandlung der Daten somit nun in 2 Schritten erfolgt.
              DANKE trotzdem für die Hilfe!!

              Comment

              Working...
              X