Ich versuche, eine Menge Datensätze in einer XML-Datei zu sortieren. Der Trick ist, dass ich verschiedene Elemente für verschiedene Knoten verwenden muss. Um ein einfaches Beispiel zu geben, ich möchte, dies zu tun: Da eine XML-Dateixsl: Eine XML-Datei mit mehreren Elementen sortieren
<?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 möchte es
Andy
Joe Bumpkin
Pumpkin
Jim Zulkin
Das heißt, eine Person kann durch jede Teilmenge der ersten aufgeführt werden Name, Nachname und ein Nickname. Der Sortierschlüssel ist der Nachname, wenn er vorhanden ist, ansonsten ist es der Spitzname, wenn er vorhanden ist, und andernfalls der Vorname.
Ich habe Schwierigkeiten hier seit der Verwendung von Variablen als xsl: Sortierschlüssel ist apparently not allowed.
Mein aktueller bester Schuss ist eine zweistufiger Transformation haben: einen speziellen Tag zu jedem Datensatz hinzufügen mit dieser Sheet
<?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 resultierenden 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 diese zweistufige Transformation funktioniert, frage ich mich, ob es eleganter ist, es in einem einzigen Schritt zu tun?
Danke eine Zillion! –
+1 für 'fn: concat' Antwort. Ich habe bearbeitet, weil Ihre Antwort-Ausgabe nicht die gewünschte Ausgabe ist –
@Zhenya: Beachten Sie, dass dies stark in Großschreibung beruht. Wenn dies aufgrund Ihrer Eingabe nicht möglich ist, sollten Sie die Raumtrennungsverkettung verwenden. –