Wie sortieren Elemente und speichern sie in einer Variablen, XSLT
Frage
Ich habe mich gefragt, ob es möglich ist, zuerst einige Elemente zu sortieren und speichern sie (bereits sortiert) in einer Variablen. Ich müsste beziehen sich auf sie XSLT gedacht, dass der Grund, warum ich sie in einer Variablen speichern möchten.
Ich habe versucht, die folgenden zu tun, aber es scheint nicht zu Arbeit
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:variable name="deposits">
<xsl:for-each select="/BookingCostings/MultiDeposits">
<xsl:sort select="substring(@DepositDate, 1, 4)" />
<xsl:sort select="substring(@DepositDate, 6, 2)" />
<xsl:sort select="substring(@DepositDate, 9, 2)" />
</xsl:for-each>
</xsl:variable>
Ich habe versucht, die Elemente von @DepositDate
im Format yyyy-mm-dd 'zu sortieren und speichern, um sie alle in der $deposits
Variable. So später, konnte ich auf sie zugreifen $deposits[1]
verwenden.
Ich würde schätzen jede Hilfe und Tipps!
Vielen Dank!
Lösung
Zum einen in der Variablendeklaration, Sie brauchen etwas zu tun, neue Knoten zu erstellen. Streng genommen Sie sortieren sie nicht, sondern nur durch sie in einer bestimmten Reihenfolge zu lesen. Ich glaube, Sie brauchen eine Art von xsl hinzuzufügen:. Kopierbefehl
<xsl:variable name="deposits">
<xsl:for-each select="/BookingCostings/MultiDeposits">
<xsl:sort select="substring(@DepositDate, 1, 4)" />
<xsl:sort select="substring(@DepositDate, 6, 2)" />
<xsl:sort select="substring(@DepositDate, 9, 2)" />
<xsl:copy-of select=".|@*" />
</xsl:for-each>
</xsl:variable>
Was dies schafft, ist ein ‚Knoten-Set‘, aber es, den Zugang benötigen Sie die Verwendung einer Erweiterungsfunktion in XSLT zu machen. Welche Sie verwenden, hängt von der XSLT-Prozessor Sie verwenden. Im Beispiel bin ich zu geben, ich die Microsoft ein verwende.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" version="1.0">
Dann, um Zugriff auf die Knoten in Ihrer Variable, können Sie so etwas wie dieses
tun<xsl:value-of select="ms:node-set($deposits)/MultiDeposits[1]/@DepositDate" />
Hier ist ein guter Artikel zu lesen, auf Knotenmengen
Andere Tipps
- Verwenden Sie
XSLT version 2.0
perform-sort
verwenden könnte und sagen, dass Ihre Variable vom Typ einer Folge vonMultiDeposits
ist mit demas keyword
(as="element(MultiDeposits)+
") - Da Ihre Daten bereits als yyyy-mm-dd können Sie vermeiden, das subtring zu verwenden, um jeden Teil des Datums zu erhalten und die Art direkt auf dem Feld verwenden
mit dieser Probe xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<BookingCostings>
<MultiDeposits depositDate="2001-10-09">1</MultiDeposits>
<MultiDeposits depositDate="1999-10-09">2</MultiDeposits>
<MultiDeposits depositDate="2010-08-09">3</MultiDeposits>
<MultiDeposits depositDate="2010-07-09">4</MultiDeposits>
<MultiDeposits depositDate="1998-01-01">5</MultiDeposits>
</BookingCostings>
und mit Hilfe der XSLT-Version 2.0 Blatt:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:variable name="deposits" as="element(MultiDeposits)+">
<xsl:perform-sort select="BookingCostings/MultiDeposits">
<xsl:sort select="@depositDate"/>
</xsl:perform-sort>
</xsl:variable>
first date:<xsl:value-of select="$deposits[1]/@depositDate"/>,
last date:<xsl:value-of select="$deposits[last()]/@depositDate"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
der Ausgang wird sein:
first date:1998-01-01, last date:2010-08-09
Raten (nicht über dev env Hand):
Add
<xsl:value-of select="." />
Vor dem Schließen </xsl:for-each>