web-dev-qa-db-fra.com

créer des tableaux dans xslt

peut-on créer et utiliser un tableau dans xslt? Si oui, existe-t-il des exemples en ligne appropriés à étudier? Sinon, existe-t-il un moyen de stocker les valeurs d'une manière qui imite un tableau?

25
gary A.K.A. G4

Avec XSLT 2.0, vous pouvez modéliser n’importe quel type de données.

À titre d'exemple:

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

Avec n'importe quelle entrée, sortie:

B

Dans XSLT 1.0, il n'y a pas de type de données Temporaly Result Tree. Il existe un type de données fragment d'arbre de résultat qui n'autorise pas l'opérateur de jeu de nœuds. Ainsi, la seule solution consiste à utiliser des fonctions d’extension: dans ce cas, node-set() de EXSLT (MSXSL a également une extension node-set() intégrée).

Ainsi, dans XSLT 1.0 sans extensions, vous ne pouvez avoir que des modèles de données en ligne, des paramètres ou un document externe. À titre d'exemple:

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

Résultat, avec n'importe quelle entrée:

B

Seulement si vous le souhaitez, je peux vous fournir un exemple d'extensions XSLT 1.0 Plus (ce n'est pas standard ...)

23
user357812

La séquence XPath 2.0 (disponible dans XSLT 2+) est la chose la plus proche d'un tableau :

(1 to 10)[3]

évalue à 3

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

évalue à 'a'

Les éléments d'une séquence peuvent être de n'importe quel type concevable permis dans XPath, à l'exception de la séquence elle-même - les séquences imbriquées ne sont pas autorisées.

Remarque : Les séquences ne sont pas identiques aux tableaux:

  1. Les séquences sont immuables . Toute opération de mise à jour sur une séquence (ajouter ou ajouter un élément, ajouter ou supprimer un élément) produit une nouvelle séquence.

  2. Il n'est pas garanti que le temps d'accès au nième élément soit égal à O(1) , car il s'agit d'un tableau et peut être O (n).

7
Dimitre Novatchev

Non, pas comme tel. Le concept le plus proche est celui des ensembles de nœuds, qui sont des ensembles de nœuds. Chaque fois que le résultat d'une sélection est un nombre de nœuds, vous obtenez un ensemble de nœuds. On peut y accéder avec une notation d'index (commençant par 1), de sorte que le premier élément de l'ensemble de nœuds soit accessible avec une notation telle que selectedNodes[1].

5
Oded

Avec XSLT 2.0, vous pouvez simplement utiliser

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="/">
    <xsl:variable name="array" select="('A','B','C')"/> 
        <xsl:value-of select="$array[2]"/>
    </xsl:template>
</xsl:stylesheet>
0
ravthiru