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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die
concat
XPath-Funktion:fn:concat
Antwort. Ich habe editiert, weil deine Antwort-Ausgang wird nicht die gewünschte AusgabeKönnen Sie versuchen, wenn Sie diese Vorlage gibt das erwartete Ergebnis? Für Ihren einfachen Beispiel gibt es die korrekte Antwort, aber es gibt vielleicht Ausnahmefälle, die nicht funktionieren. Normalize-space wird hier verwendet, um entfernen Sie führende und nachfolgende Leerzeichen, wenn eines der Elemente fehlt.