Cyberfuzzy: Sortierproblem? (2. Stufe)

Hallo,

ich habe ja letzte Woche schon eine super Hilfe wegen einem XSL Sortierproblem bekommen.

Jetzt bin ich an der nächsten Stufe angelangt, wo ich mal wieder nicht weiter weiß.

Ausgangs XML:

<test>
  <AREA1>
    <DATENSATZ>
      <ARTIKEL>12345</ARTIKEL>
      <TEIL>10</TEIL>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>12345</ARTIKEL>
      <TEIL>20</TEIL>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>12345</ARTIKEL>
      <TEIL>30</TEIL>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>12345</ARTIKEL>
      <TEIL>40</TEIL>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>10080</ARTIKEL>
      <TEIL>60</TEIL>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>10080</ARTIKEL>
      <TEIL>70</TEIL>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>10080</ARTIKEL>
      <TEIL>80</TEIL>
    </DATENSATZ>
  </AREA1>
  <AREA2>
    <DATENSATZ>
      <ARTIKEL>12345</ARTIKEL>
      <DOKUMENT>1030</DOKUMENT>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>12345</ARTIKEL>
      <DOKUMENT>1040</DOKUMENT>
    </DATENSATZ>
    <DATENSATZ>
      <ARTIKEL>10080</ARTIKEL>
      <DOKUMENT>1090</DOKUMENT>
    </DATENSATZ>
  </AREA2>
</test>

Das XSL soll so sortieren, dass ich hinterher folgendes herausbekomme:

Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40 / Dokumente: 1030, 1040
Artikel: 10080 / dazugehörige Teile: 60, 70, 80 / Dokumente: 1090

Das Problem ist hier, dass sich die Dokumente weiter unten in der XML in einer anderen Area befinden. Gibt es hierfür überhaupt eine Möglichkeit?

Danke schonmal :-)

Grüße
Cyberfuzzy
--
http://www.cyberfuzzy.com

  1. Hi,

    es gibt vielleicht auf noch elegantere Lösungen, aber diese sollte funktionieren ;-)

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="html" encoding="UTF-8" indent="yes"/>

    <xsl:key name="datensatz" match="*" use="ARTIKEL"/>

    <xsl:template match="/">
            <xsl:for-each
                select="/*/*/DATENSATZ[generate-id() = generate-id(key('datensatz', ARTIKEL)[1])]">
                <xsl:sort select="ARTIKEL" data-type="number"/>
                <xsl:variable name="currentArtikel" select="ARTIKEL"/> Artikel: <xsl:value-of
                    select="ARTIKEL"/> / dazugehörige Teile: <xsl:for-each
                    select="/*/AREA1/DATENSATZ[ARTIKEL = $currentArtikel]">
                    <xsl:sort select="TEIL" order="ascending"/>
                    <xsl:value-of select="TEIL"/>; </xsl:for-each> / dazugehörige Dokument:
                <xsl:sort select="DOCUMENT" order="ascending"/>
                <xsl:for-each select="/*/AREA2/DATENSATZ[ARTIKEL = $currentArtikel]">
                    <xsl:value-of select="DOKUMENT"/>; </xsl:for-each><br/>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>

    Gruß,

    Holger

    Hallo,

    ich habe ja letzte Woche schon eine super Hilfe wegen einem XSL Sortierproblem bekommen.

    Jetzt bin ich an der nächsten Stufe angelangt, wo ich mal wieder nicht weiter weiß.

    Ausgangs XML:

    <test>
      <AREA1>
        <DATENSATZ>
          <ARTIKEL>12345</ARTIKEL>
          <TEIL>10</TEIL>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>12345</ARTIKEL>
          <TEIL>20</TEIL>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>12345</ARTIKEL>
          <TEIL>30</TEIL>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>12345</ARTIKEL>
          <TEIL>40</TEIL>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>10080</ARTIKEL>
          <TEIL>60</TEIL>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>10080</ARTIKEL>
          <TEIL>70</TEIL>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>10080</ARTIKEL>
          <TEIL>80</TEIL>
        </DATENSATZ>
      </AREA1>
      <AREA2>
        <DATENSATZ>
          <ARTIKEL>12345</ARTIKEL>
          <DOKUMENT>1030</DOKUMENT>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>12345</ARTIKEL>
          <DOKUMENT>1040</DOKUMENT>
        </DATENSATZ>
        <DATENSATZ>
          <ARTIKEL>10080</ARTIKEL>
          <DOKUMENT>1090</DOKUMENT>
        </DATENSATZ>
      </AREA2>
    </test>

    Das XSL soll so sortieren, dass ich hinterher folgendes herausbekomme:

    Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40 / Dokumente: 1030, 1040
    Artikel: 10080 / dazugehörige Teile: 60, 70, 80 / Dokumente: 1090

    Das Problem ist hier, dass sich die Dokumente weiter unten in der XML in einer anderen Area befinden. Gibt es hierfür überhaupt eine Möglichkeit?

    Danke schonmal :-)

    Grüße
    Cyberfuzzy

    http://www.cyberfuzzy.com

    1. Hallo hh,

      etwas OT hier: es geht um deine Frage zu Schema:
      ich denke nicht, dass was du erreichen möchtest möglich ist. Jedoch ist diese Ansicht nur das Ergebnis vom Nachdenken, d.h. ich habe keine Test dazu gemacht. Da ich dazu auch nicht die Zeit habe, würde ich dir empfehlen in der xmldev-Mailing-Liste http://www.xml.org/xml/xmldev.shtml nachzufragen, ev. hat jemand dort einen Lösungsvorschlag.

      Grüße
      Thomas

  2. Hallo,

    Jetzt bin ich an der nächsten Stufe angelangt, wo ich mal wieder nicht weiter weiß.

    Das XSL soll so sortieren, dass ich hinterher folgendes herausbekomme:

    Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40 / Dokumente: 1030, 1040
    Artikel: 10080 / dazugehörige Teile: 60, 70, 80 / Dokumente: 1090

    Das Problem ist hier, dass sich die Dokumente weiter unten in der XML in einer anderen Area befinden. Gibt es hierfür überhaupt eine Möglichkeit?

    Dann setzen wir das XSL dort fort, wo es aufgehört hat und machen wir drei kleine Ergänzungen:

    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:key name="datensatz" match="DATENSATZ" use="ARTIKEL" />
     <xsl:template match="/test">
      <html>
       <head>
        <title>Untitled</title>
       </head>
       <body>
        <xsl:for-each select="AREA1/DATENSATZ[generate-id() = generate-id(key('datensatz', ARTIKEL)[1])]">
         <xsl:sort select="ARTIKEL" data-type="number" />

    Artikel: <xsl:value-of select="ARTIKEL" /> / dazugehörige Teile:
          <xsl:for-each select="key('datensatz', ARTIKEL)[ancestor::AREA1]">
           <xsl:value-of select="TEIL" />
           <xsl:if test="position() != last()">, </xsl:if>
          </xsl:for-each>

    / Dokumente:
          <xsl:for-each select="key('datensatz', ARTIKEL)[ancestor::AREA2]">
           <xsl:value-of select="DOKUMENT" />
           <xsl:if test="position() != last()">, </xsl:if>
          </xsl:for-each>
          <br />
        </xsl:for-each>
       </body>
      </html>
     </xsl:template>
    </xsl:stylesheet>

    Du kannst statt:
    <xsl:for-each select="AREA1/DATENSATZ[generate-id() = generate-id(key('datensatz', ARTIKEL)[1])]">

    auch: <xsl:for-each select="//DATENSATZ   ...  nehmen,

    Grüße
    Thomas