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!

War es hilfreich?

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

Xml.com Artikel auf Node-Sets

Andere Tipps

  1. Verwenden Sie XSLT version 2.0 perform-sort verwenden könnte und sagen, dass Ihre Variable vom Typ einer Folge von MultiDeposits ist mit dem as keyword (as="element(MultiDeposits)+ ")
  2. 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>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top