2010-07-21 16 views
24

gli array possono essere creati e utilizzati in xslt? Se è così ci sono esempi adatti online da studiare? Se no, c'è un modo per memorizzare i valori in un modo che riproduce un array?creazione di array in xslt

+0

Buona domanda (+1). Vedere la mia risposta per una descrizione dettagliata del tipo di dati XPath (e XSLT) più vicino all'array. –

risposta

23

Con XSLT 2.0 è possibile modellare qualsiasi tipo di dati desiderato.

Come esempio:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="array" as="element()*"> 
     <Item>A</Item> 
     <Item>B</Item> 
     <Item>C</Item> 
    </xsl:variable> 
    <xsl:template match="/"> 
     <xsl:value-of select="$array[2]"/> 
    </xsl:template> 
</xsl:stylesheet> 

Con qualsiasi ingresso, uscita:

B 

In XSLT 1.0 non viene temporaneamente Risultato Albero tipo di dati. Esiste un tipo di dati Frammento albero risultati che non consente l'operatore del set di nodi. Quindi, l'unica strada da percorrere è con le funzioni di estensione: in questo caso node-set() da EXSLT (anche MSXSL ha un'estensione integrata node-set()).

Quindi, in XSLT 1.0 senza estensioni si può avere solo il modello di dati in linea, o mediante parametri o da un documento esterno. A titolo di esempio:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:variable name="inline-array"> 
     <Item>A</Item> 
     <Item>B</Item> 
     <Item>C</Item> 
    </xsl:variable> 
    <xsl:param name="array" select="document('')/*/xsl:variable[@name='inline-array']/*"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="$array[2]"/> 
    </xsl:template> 
</xsl:stylesheet> 

Risultato, con qualsiasi ingresso:

B 

Solo se si vuole, posso fornire un XSLT 1.0, più le estensioni esempio (Non è standar ...)

+1

@Alejandro: da quello che posso vedere, stai semplicemente usando _name_ 'array' che è una raccolta di nodi di elementi. – Oded

+2

@Oded: Esatto! Questo è il concetto di ** modellazione dei dati **. La caratteristica principale dei tipi di dati dell'array è l'accesso casuale. Questo modello copre questo come spettacolo. –

+0

@Alejandro: nominando qualcosa, un array non lo rende un array. La cosa più vicina a una in xsl è un set di nodi. – Oded

5

No, non come tale. Il concetto più vicino sono i nodi-set, che sono insiemi di nodi. Ogni volta che il risultato di una selezione è un numero di nodi, si ottiene un set di nodi. A questi si può accedere con una notazione indice (che inizia con 1), quindi è possibile accedere al primo elemento del set di nodi con notazione come selectedNodes[1].

+0

Penso che questo non sia del tutto corretto. Controlla la mia risposta. –

6

la sequenza XPath 2.0 (disponibile in XSLT 2+) è la cosa più vicina ad una matrice:

(1 to 10)[3] 

viene valutato come 3

('a', 'b', 'a', 'c')[3] 

viene valutato come 'a'

Gli elementi di una sequenza può essere di qualsiasi tipo concepibile consentito in XPath, ad eccezione della sequenza stessa - sequenze nidificate non sono ammessi.

Do atto: sequenze non sono la stessa come array:

  1. sequenze sono immutabili. Qualsiasi operazione di aggiornamento su una sequenza (aggiungendo o anteponendo un oggetto, inserendo un oggetto o rimuovendo un oggetto) produce una nuova sequenza.

  2. Il tempo di accesso all'elemento n-esimo non è garantito come O (1) come questo per gli array e può essere O (n).

+0

+1 buona risposta! In seguito mi sono reso conto di aver dimenticato il tipo di dati di sequenza. Mi sono perso difendendo l'idea della modellazione dei dati. –

+0

@ Alejandro: che cos'è la "modellazione dei dati"? :) –

+0

Ci scusiamo per il mio inglese. Dovrei dire il tipo di dati astratti. –