Announcement

Collapse
No announcement yet.

Mehrfache Sortierung

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

  • Mehrfache Sortierung

    Hallo,

    ich trete gerade ein wenig auf der Stelle mit einer Sortierung.

    Die XML sieht wie folgt aus ...

    <Artikel>
    <Ausgabe>
    <Auflage>
    ...
    <Artikelgruppen>
    <Bezeichnung>C</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>B</Bezeichnung>
    </Artikelgruppen>

    ...
    </Auflage>

    <Auflage>
    ...
    <Artikelgruppen>
    <Bezeichnung>D</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>E</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>A</Bezeichnung>
    </Artikelgruppen>
    ...
    </Auflage>
    </Ausgabe>

    </Artikel>


    Ziel ist es die Artikelgruppen für jede "Auflage" alphabetisch zu sortieren und dann alle "Auflagen" innerhalb von Artikel nach der Bezeichnung der ersten Artikelgruppe zu sortieren. Gewünschtes Ergebnis wäre somit


    <Artikel>
    <Ausgabe>

    <Auflage>
    ...
    <Artikelgruppen>
    <Bezeichnung>A</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>D</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>E</Bezeichnung>
    </Artikelgruppen>

    ...
    </Auflage>


    <Auflage>
    ...

    <Artikelgruppen>
    <Bezeichnung>B</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>C</Bezeichnung>
    </Artikelgruppen>

    ...
    </Auflage>


    </Ausgabe>

    </Artikel>







    Meine plumpe "Lösung" hierfür war:

    <Artikel>

    <xsl:for-each select="Ausgabe/Auflage">

    <xsl:for-each select="Artikelgruppen">
    <xsl:sort select="Bezeichnung" data-type="text"/>
    </xsl:for-each>
    <xsl:sort select="Artikelgruppen/Bezeichnung" data-type="text"/>

    <Ausgabe><xsl:copy-of select="."/></Ausgabe>
    </xsl:for-each>

    </Artikel>


    Dies sortiert zwar alle "Auflagen" innerhalb des Artikels nach der ersten Artikelgruppenbezeichnung, aber ohne die vorherige Sortierung der Artikelgruppen bringt dies freilich wenig. Im genannten Beispiel:


    <Artikelgruppen>
    <Bezeichnung>C</Bezeichnung>
    </Artikelgruppen>

    <Artikelgruppen>
    <Bezeichnung>B</Bezeichnung>
    </Artikelgruppen>
    ...
    </Auflage>

    <Auflage>
    ...
    <Artikelgruppen>
    <Bezeichnung>D</Bezeichnung>
    </Artikelgruppen>
    ...
    </Auflage>


    Vielen Dank fürs Lesen und im Voraus

    Eichhörnchen
    Zuletzt editiert von Eichhörnchen; 03.03.2010, 12:27.

  • #2
    Benutzt du XSLT 1.0 oder 2.0? Du wirst die erste Sortierung vornehmen und in einer Variablen speichern müssen, dann die zweite Sortieren auf das in der Variablen gespeicherte Zwischenresultat anwenden müssen. Mit XSLT 2.0 ist das problemlos möglich, mit 1.0 braucht es eine Erweiterungsfunktion wie exsl:node-set, um das Zwischenresultat weiter verarbeiten zu können.

    Comment


    • #3
      Danke für die Antwort, ich hatte mir so etwas ähnliches schon gedacht.
      Schade irgendwie das das XSLT 1.0 so schnell komplex wird. Ich werde es mal mit XSLT 2.0 probieren wenn Zeit ist und dann das Ergebnis posten.

      Comment


      • #4
        Anderer Lösungsansatz

        Die Speicherung in einer Variablen habe ich nicht hingekriegt, aber bei mir scheiterte schon der Ansatz überhaupt die Sortierung nach Artikelgruppen anhand der Bezeichnung innerhalb von Auflage.

        (Ziel wäre es gewesen die: Die Artikelgruppen innerhalb von Auflage nach Bezeichnung innerhalb von Artikelgruppen sortieren. Vermutlich fehlte mir da einfach die entsprechende XPath Syntax)

        Da ich einfache, plumpe, modulare Lösungen (da sie für andere einfacher nachzuvollziehen sind und ich leider kein wirklicher XSL Crack bin) vorziehe bin ich daher wie folgt vorgegangen (Darstellung der XSL).


        <xsl:template match="Artikel">
        ...

        <xsl:for-each select="Ausgabe/Auflage" xml:space="default">
        <xsl:for-each select="Artikelgruppen/Bezeichnung[.='blablabla']">
        <Artikel>

        <Haupttitel><xsl:apply-templates select="../../Haupttitel"/></Haupttitel>

        <Untertitel><xsl:apply-templates select="../../Untertitel"/></Untertitel>

        ...

        </Artikel>
        </xsl:for-each>
        </xsl:for-each>


        So gebe ich in diesem Modul nur eine bestimmte "Auflage" einer gewünschten (Artikelgruppen)Bezeichnung aus, was letztendlich besser ist als eine Sortierung der Artikelgruppen. Wenn ich mehrere "Auflagen" ausgeben will, füge ich einfach weitere Module hinzu und ändere die gewünschte Bezeichnung.

        So ist es auch möglich eine Filterung vorzunehmen.

        Wenn ein Artikel mehrere Artikelgruppen hat, kommt es allerdings zu doppelter Ausgabe. Dies war aber auch so gewünscht, hat sich allerdings erst im Laufe eines Gesprächs ergeben. Vielleicht hilft es trotzdem jemanden weiter.


        Alles Gute

        Eichhörnchen ...
        Zuletzt editiert von Eichhörnchen; 12.03.2010, 11:15. Reason: Quellcode enthielt irrelevanten Text für die spätere Satzverarbeitung

        Comment

        Working...
        X