Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Wie in XML-Daten die Kindknoten von Kindknoten sortieren? (https://www.delphipraxis.net/47355-wie-xml-daten-die-kindknoten-von-kindknoten-sortieren.html)

toko 9. Jun 2005 21:24


Wie in XML-Daten die Kindknoten von Kindknoten sortieren?
 
Hallo,

ich habe nochmal eine Frage.
Wenn ich mit diesem resourcestring
Delphi-Quellcode:
  fmtXSLdata = '<?xml version="1.0"?>' +
               '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
                 '<xsl:template match="/ | @* | node()">' +
                   '<xsl:copy>' +
                     '<xsl:apply-templates select="@* | node()">' +
                       '<xsl:sort select="%s"/>' +
                     '</xsl:apply-templates>' +
                   '</xsl:copy>'+
                 '</xsl:template>'+
               '</xsl:stylesheet>';
und für den Formatbezeichner s die Strings '@id', '@titel', '@interpret' oder '@genre' eingebe, kann ich die CD-Elemente
XML-Code:
<?xml version="1.0"?>
<cdorganizer>
   <cd id="1" titel="g testcd1" interpret="testinterpret1" genre="genre1">
      <track id="1" titel="e testtrack1" interpret="testinterpret1" dauer="11:11:11"/>
      <track id="2" titel="d testtrack2" interpret="testinterpret2" dauer="11:11:12"/>
      <track id="3" titel="c testtrack3" interpret="testinterpret3" dauer="11:11:13"/>
      <track id="4" titel="b testtrack4" interpret="testinterpret4" dauer="11:11:14"/>
      <track id="5" titel="a testtrack5" interpret="testinterpret5" dauer="11:11:15"/>
   </cd>
   <cd id="2" titel="f testcd2" interpret="testinterpret2" genre="genre2">
   </cd>
   <cd id="3" titel="e testcd3" interpret="testinterpret3" genre="genre3">
   </cd>
   <cd id="4" titel="d testcd4" interpret="testinterpret4" genre="genre4">
   </cd>
   <cd id="5" titel="c testcd5" interpret="testinterpret5" genre="genre5">
   </cd>
   <cd id="6" titel="b testcd6" interpret="testinterpret6" genre="genre6">
   </cd>
   <cd id="7" titel="a testcd7" interpret="testinterpret7" genre="genre7">
   </cd>
</cdorganizer>
nach dem übergebenen String sortieren.

Wie kann ich aber denn die tracks sortieren? Ich muss doch irgendwie in dem resourcestring, also in den XSL-Daten, die Knotenebene angeben können, in der ich nach den Attributen eines TrackKnoten (also im Prinzip wie oben, bloß eine Hierachie tiefer) sortieren möchte.

Könnt ihr mir helfen?

marabu 10. Jun 2005 07:36

Re: Wie in XML-Daten die Kindknoten von Kindknoten sortieren
 
Hallo toko,

mit dem folgenden XSLT-Code kannst du deine Daten zweistufig sortieren. Bei deinen track numbers wirst du recht bald in den zweistelligen Bereich geraten. Um dir dann Kopfschmerzen zu ersparen habe ich dem xsl:sort bereits das Attribut data-type hinzugefügt. Auch diesen Code kannst du in ein Template verwandeln, allerdings sind es jetzt zwei xsl:sort Elemente, die du dann instanziieren musst. Außerdem musst du den data-type entsprechend anpassen.

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

  <xsl:template match="cd">
    <xsl:copy>
      <xsl:apply-templates select="@* | track">
        <xsl:sort select="@titel" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="cdorganizer">
    <xsl:copy>
      <xsl:apply-templates select="@* | cd">
        <xsl:sort select="@id" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
Grüße vom marabu

toko 10. Jun 2005 10:33

Re: Wie in XML-Daten die Kindknoten von Kindknoten sortieren
 
Hallo marabu,

Danke für deine Antwort.

Zitat:

mit dem folgenden XSLT-Code kannst du deine Daten zweistufig sortieren.
heist dass, wenn ich in meinem Programm die CDs in einem Grid darstelle und die Tracks in einem anderen, dass ich das erste Grid - die CDs - nach "titel" sortieren kann und das zweite Grid - also die Tracks - nach der "id" sortieren kann?

Zitat:

Bei deinen track numbers wirst du recht bald in den zweistelligen Bereich geraten.
Bei meinen CDs kann ich ja auch schnell über 9 Einträge anlegen, oder habe ich die "Zweistelligkeit" falsch verstanden?

Zitat:

Um dir dann Kopfschmerzen zu ersparen habe ich dem xsl:sort bereits das Attribut data-type hinzugefügt.
Find ich gut :thumb:. Das heißt also ich muss den data-type auf "text" setzen, wenn ich nach "titel", "interpret" und "genre" sortieren möchte und auf "number", wenn ich nach "id" und "dauer" sortieren möchte.

Zitat:

allerdings sind es jetzt zwei xsl:sort Elemente
Also muss ich einen zweiten resourcestring anlegen?

Wie du wahrscheinlich merkst, verwirrt mich diese Sache etwas. Da ich mich schon im Netz dämlich gesucht habe, kannst du mir vielleicht eine Quelle nennen, die den Aufbau solcher XSL-Daten beschreibt? Wäre echt super...

Also, wiedereinmal besten Dank für deine Hilfe...
Gruß ToKo

marabu 10. Jun 2005 11:07

Re: Wie in XML-Daten die Kindknoten von Kindknoten sortieren
 
Hallo toko,

Zitat:

Zitat von toko
heißt dass, wenn ich in meinem Programm die CDs in einem Grid darstelle und die Tracks in einem anderen, dass ich das erste Grid - die CDs - nach "titel" sortieren kann und das zweite Grid - also die Tracks - nach der "id" sortieren kann?

Ja - du sortierst ja das XML-Dokument und entnimmst dann die Element-Werte zur Darstellung in deinen Grids.

Zitat:

Zitat von toko
Bei meinen CDs kann ich ja auch schnell über 9 Einträge anlegen, oder habe ich die "Zweistelligkeit" falsch verstanden?

Genau das habe ich gemeint.

Zitat:

Zitat von toko
Das heißt also ich muss den data-type auf "text" setzen, wenn ich nach "titel", "interpret" und "genre" sortieren möchte und auf "number", wenn ich nach "id" und "dauer" sortieren möchte.

Die Dauer habe ich bei deinem Beispiel-Dokument als Text in Erinnerung.

Zitat:

Zitat von toko
Also muss ich einen zweiten resourcestring anlegen?

Nein, du kannst alles in einen resourcestring verpacken - die Zahl der Platzhalter ist egal.

Zitat:

Zitat von toko
Da ich mich schon im Netz dämlich gesucht habe, kannst du mir vielleicht eine Quelle nennen, die den Aufbau solcher XSL-Daten beschreibt?

Ich benutze zum Nachschlagen den MS Platform SDK, du kannst dir aber auch den MSXML SDK herunterladen und installieren - der hat einen bedeutend kleineren Umfang.

Freundliche Grüße vom marabu

toko 14. Jun 2005 22:08

Re: Wie in XML-Daten die Kindknoten von Kindknoten sortieren
 
Hat jetzt endlich geklappt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz