Cyberfuzzy: Sortierproblem?

Hallo,

ich habe ein Problem mit XSL. Ich habe verschiedene Datensätze als Ausgangs-XML:

<test>
  <DATENSATZ>
    <ATRIKEL>12345</ATRIKEL>
    <TEIL>10</TEIL>
  </DATENSATZ>
  <DATENSATZ>
    <ATRIKEL>12345</ATRIKEL>
    <TEIL>20</TEIL>
  </DATENSATZ>
  <DATENSATZ>
    <ATRIKEL>12345</ATRIKEL>
    <TEIL>30</TEIL>
  </DATENSATZ>
  <DATENSATZ>
    <ATRIKEL>12345</ATRIKEL>
    <TEIL>40</TEIL>
  </DATENSATZ>
  <DATENSATZ>
    <ATRIKEL>10080</ATRIKEL>
    <TEIL>60</TEIL>
  </DATENSATZ>
  <DATENSATZ>
    <ATRIKEL>10080</ATRIKEL>
    <TEIL>70</TEIL>
  </DATENSATZ>
  <DATENSATZ>
    <ATRIKEL>10080</ATRIKEL>
    <TEIL>80</TEIL>
  </DATENSATZ>
</test>

Hier habe ich zwei Artikel und verschiedene dazugehörige Teile. Ich möchte per XSL ein HTML ausgeben, dass mir eine Ansicht gibt, bei dem einmal der Artikel gezeigt wird und daneben die zugehörigen Teile. Z. B. so:
Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40
Artikel: 10080 / dazugehörige Teile: 60, 70, 80

Wie gehe ich dazu am besten ran? Muss ich erst eine Schleife über alles machen, um festzustellen, wieviele verschiedene Artikel vorhanden sind, um diese dann in einer Variable zu speichern? Oder hat jemand eine vernünftige Idee?

Vielen Dank schonmal :-)

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

  1. Hallo,

    ich habe ein Problem mit XSL. Ich habe verschiedene Datensätze als Ausgangs-XML:
    Hier habe ich zwei Artikel und verschiedene dazugehörige Teile. Ich möchte per XSL ein HTML ausgeben, dass mir eine Ansicht gibt, bei dem einmal der Artikel gezeigt wird und daneben die zugehörigen Teile. Z. B. so:
    Artikel: 12345 / dazugehörige Teile: 10, 20, 30, 40
    Artikel: 10080 / dazugehörige Teile: 60, 70, 80

    Wie gehe ich dazu am besten ran?

    <xsl:key name="datensatz" match="DATENSATZ" use="ARTIKEL" />
    ...
    <xsl:for-each select="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)">
      <xsl:value-of select="TEIL" />
      <xsl:if test="position() != last()">, </xsl:if>
     </xsl:for-each>
     <br />
    </xsl:for-each>

    Grüße
    Thomas

    1. Hallo,

      danke für die schnelle Antwort. Bis jetzt habe ich es leider noch nicht geschafft, dass auf der Seite etwas erscheint.
      Das ist meine XSL:

      <?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="DATENSATZ" 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" />
         Artikel: <xsl:value-of select="ARTIKEL" /> / dazugehörige Teile:
         <xsl:for-each select="key('datensatz', ARTIKEL)">
          <xsl:value-of select="TEIL" />
          <xsl:if test="position() != last()">, </xsl:if>
         </xsl:for-each>
         <br />
        </xsl:for-each>

      </xsl:template>

      </xsl:stylesheet>

      Garantiert habe ich nur eine Kleinigkeit übersehen, oder?

      Gruß
      Cyberfuzzy
      --
      http://www.cyberfuzzy.com

      1. Hallo,

        danke für die schnelle Antwort. Bis jetzt habe ich es leider noch nicht geschafft, dass auf der Seite etwas erscheint.
        Das ist meine XSL:

        ev.

        <xsl:template match="/rootelement">

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

        Garantiert habe ich nur eine Kleinigkeit übersehen, oder?

        In dienem XML verwendest du:
        <ATRIKEL>12345</ATRIKEL>
          ^^
        Und ich habe A_RT_IKEL genommen.

        Grüße
        Thomas

        1. Ach mein Gott, das hab ich wohl verbockt. Naja, vielen Dank, jetzt hat es funktioniert :-)