xsl:sort eine XML-Datei mit mehreren Elementen

Ich versuche zu Sortieren eine Reihe von Datensätzen in eine XML-Datei. Der trick ist, dass ich brauche zu Sortieren, mit verschiedenen Elementen für die verschiedenen Knoten. Geben Sie ein einfachstes Beispiel, ich möchte, um dies zu tun: gegeben sei eine xml-Datei

<?xml version="1.0" encoding="utf-8" ?>

<buddies>

<person>
<nick>Jim</nick>
<last>Zulkin</last>
</person>

<person>
<first>Joe</first>
<last>Bumpkin</last>
</person>

<person>
<nick>Pumpkin</nick>
</person>

<person>
<nick>Andy</nick>
</person>

</buddies>

Ich konvertieren wollen

Andy
Joe Bumpkin
Pumpkin
Jim Zulkin

Ist, kann eine person aufgeführt werden, indem eine beliebige Teilmenge der Vorname, Nachname und nick.
Der Sortierschlüssel ist der Letzte name, wenn es vorhanden ist, ansonsten ist es der Spitzname, wenn es vorhanden ist, und ein Vorname anders.

Ich habe hier Schwierigkeiten, da mit der Variablen xsl:sort keys ist anscheinend nicht erlaubt.

Meine aktuelle best-shot ist eine zwei-Schritt-transformation: Fügen Sie einen besonderen tag, um jeden Datensatz mit diesem stylesheet

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output omit-xml-declaration="no" indent="yes"/>

<!-- *** convert each person record into a person2 record w/the sorting key *** -->
<xsl:template match="/buddies">
    <buddies>
    <xsl:for-each select="person">
     <person2>
        <xsl:copy-of select="*"/>
        <!-- add the sort-by tag -->
        <sort-by>
        <xsl:choose>
            <xsl:when test="last"> <xsl:value-of select="last"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:choose>
                    <xsl:when test="nick"> <xsl:value-of select="nick"/> </xsl:when>
                    <xsl:otherwise> <xsl:value-of select="first"/> </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </sort-by>
  </person2>
</xsl:for-each>
</buddies>

Und dann Sortieren Sie die erzeugte xml -

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/buddies">
    <xsl:apply-templates>
        <xsl:sort select="sort-by"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="person2">
   <xsl:value-of select="first"/>
   <xsl:value-of select="nick"/>
   <xsl:value-of select="last"/><xsl:text>
</xsl:text>
</xsl:template>

Während dieser zwei-Schritt-Transformation funktioniert, Frage ich mich, ob es eleganter Weg, es zu tun in nur einer gehen?

InformationsquelleAutor ev-br | 2010-08-28
Schreibe einen Kommentar