2010-07-21 17 views
24

können Arrays in xslt erstellt und verwendet werden? Wenn ja, gibt es geeignete Beispiele, um zu lernen? Wenn nicht, gibt es eine Möglichkeit, Werte so zu speichern, dass ein Array nachgebildet wird.Erstellen von Arrays in xslt

+0

Gute Frage (+1). In meiner Antwort finden Sie eine detaillierte Beschreibung des Datentyps, der dem Array XPath (und XSLT) am nächsten kommt. –

Antwort

23

Mit XSLT 2.0 können Sie beliebige Datentypen modellieren.

Als Beispiel:

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

Mit jedem Eingang, Ausgang:

B 

In XSLT 1.0 gibt nicht Temporaly ist Baum Ergebnis Datentyp. Es gibt einen Ergebnistypfragmentdatentyp, der den Knotenmengenoperator nicht zulässt. Also, der einzige Weg zu gehen ist mit Erweiterungen Funktionen: in diesem Fall node-set() von EXSLT (MSXSL hat eine eingebaute node-set() Erweiterung, auch).

Also, in XSLT 1.0 ohne Erweiterungen können Sie nur Inline-Datenmodell oder nach Params oder externem Dokument haben. Als Beispiel:

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

Ergebnis, mit jedem Eingang:

B 

Nur wenn Sie wollen, kann ich Ihnen ein XSLT 1.0 und Erweiterungen Beispiel liefern (es ist nicht standar ...)

+1

@ Alejandro - von dem, was ich sehen kann, verwenden Sie einfach das _name_'Array', das eine Sammlung von Elementknoten ist. – Oded

+2

@Oded: Das stimmt! Das ist das Konzept der ** Datenmodellierung **. Das Hauptmerkmal von Array-Datentypen ist der Direktzugriff. Dieses Modell deckt das wie gezeigt ab. –

+0

@ Alejandro - etwas benennen ein Array macht es nicht zu einem Array. Am nächsten zu einem in xsl ist eine Knotenmenge. – Oded

5

Nein, nicht als solches. Das nächstliegende Konzept sind Knoten-Sets, die Sammlungen von Knoten sind. Wenn das Ergebnis einer Auswahl eine Anzahl von Knoten ist, erhalten Sie eine Knotenmenge. Auf diese kann mit einer Indexnotation (beginnend mit 1) zugegriffen werden, so dass auf das erste Element der Knotenmenge mit einer Notation wie selectedNodes[1] zugegriffen werden kann.

+0

Ich denke, das ist nicht ganz richtig. Überprüfe meine Antwort. –

6

XPath-2.0-Sequenz (in XSLT 2+) ist das nächste, was zu einem Array:

(1 to 10)[3] 

ausgewertet 3

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

zu 'a' auswertet kann

die Elemente in einer Abfolge von jeder denkbaren Art in XPath erlaubt sein, mit Ausnahme der Sequenz selbst - verschachtelte Sequenzen, die nicht erlaubt sind.

Sie beachten: Sequenzen sind nicht das gleiche wie Arrays:

  1. Sequenzen sind unveränderlich. Jeder Aktualisierungsvorgang für eine Sequenz (Anfügen oder Voranstellen eines Elements, Einfügen eines Elements oder Entfernen eines Elements) erzeugt eine neue Sequenz.

  2. Die Zugriffszeit auf den n-ten Punkt ist nicht garantiert, O (1) wie dies für Arrays ist, und möglicherweise O (n).

+0

+1 gute Antwort! Ich habe später erkannt, dass ich den Sequenz-Datentyp vergessen habe. Ich habe es versäumt, die Idee der Datenmodellierung zu verteidigen. –

+0

@ Alejandro: Was ist "Datenmodellierung"? :) –

+0

Sorry für meine in Englisch. Ich sollte den abstrakten Datentyp sagen. –

Verwandte Themen