Domanda

Mi chiedevo se è possibile ordinare alcuni elementi prima e memorizzarli (già ordinato) in una variabile. Avrei bisogno di fare riferimento a loro pensato XSLT è per questo che mi piacerebbe per memorizzarli in una variabile.

Stavo cercando di fare quanto segue, ma non sembra funzionare

<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>

Stavo cercando di ordinare gli elementi di @DepositDate nel formato 'AAAA-MM-dd' e li memorizza nella variabile $deposits. In modo che poi, ho potuto accedervi utilizzando $deposits[1].

Gradirei qualsiasi aiuto e consigli!

Grazie mille!

È stato utile?

Soluzione

In primo luogo, nella vostra dichiarazione di variabile, si ha bisogno di fare qualcosa per creare nuovi nodi. A rigor di termini, non sono loro ordinamento, ma solo leggendo attraverso di loro in un determinato ordine. Penso che avete bisogno di aggiungere una sorta di xsl:. Comando di copia

<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> 

Ciò crea un 'nodo-set', ma per accedervi è necessario fare uso di una funzione di estensione in XSLT. Quale si usa dipende dal processore XSLT che si sta utilizzando. Nell'esempio che sto per dare, io sto usando quella di Microsoft.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt" version="1.0"> 

Quindi, per accedere ai nodi nella variabile, si può fare qualcosa di simile

<xsl:value-of select="ms:node-set($deposits)/MultiDeposits[1]/@DepositDate" />

Ecco un buon articolo di leggere su nodo-set

Xml.com articolo sul nodo-Sets

Altri suggerimenti

  1. Uso XSLT version 2.0 si potrebbe usare perform-sort e dire che la variabile è di tipo di una sequenza di MultiDeposits utilizzando il as keyword (as="element(MultiDeposits)+ ")
  2. Dal momento che i vostri dati è già come aaaa-mm-gg si può evitare di utilizzare la subtring per ottenere ogni parte della data e utilizzare il tipo direttamente sul campo

con un esempio 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>

e utilizzando la versione XSLT foglio di 2.0:

<?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>

che l'output sarà:

first date:1998-01-01, last date:2010-08-09

Indovina (non hanno dev ENV a portata di mano):

Aggiungi <xsl:value-of select="." />

Prima della </xsl:for-each> di chiusura

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top