2010-07-21 19 views
24

¿se pueden crear y usar las matrices en xslt? Si es así, ¿hay ejemplos adecuados en línea para estudiar? Si no, ¿hay alguna manera de almacenar valores de una manera que imite una matriz?creando matrices en xslt

+0

Buena pregunta (1). Consulte mi respuesta para obtener una descripción detallada del tipo de datos XPath (y XSLT) más cercano al array. –

Respuesta

23

Con XSLT 2.0 se puede modelar cualquier tipo de datos que desea.

Como ejemplo:

<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 cualquier entrada, salida:

B 

En XSLT 1.0 No hay Resultado provisoriamente árbol de tipo de datos. Hay un tipo de datos de Fragmento de árbol de resultado que no permite el operador de conjunto de nodos. Por lo tanto, la única forma de hacerlo es con las funciones de extensiones: en este caso, node-set() de EXSLT (MSXSL también tiene una extensión node-set() incorporada).

Así, en XSLT 1.0 sin extensiones que puede tener único modelo de datos en línea, o por params o mediante documento externo. Como ejemplo:

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

resultado, con cualquier entrada:

B 

Sólo si quieres, te puedo proporcionar una XSLT 1.0, más extensiones ejemplo (No es standar ...)

+1

@Alejandro - por lo que puedo ver, simplemente está usando _name_ 'array' que es una colección de nodos de elementos. – Oded

+2

@Oded: ¡Eso es! Ese es el concepto de ** modelado de datos **. La característica principal de los tipos de datos de matriz es el acceso aleatorio. Este modelo cubre eso como se muestra. –

+0

@Alejandro: nombrar algo una matriz no lo convierte en una matriz. Lo más parecido a uno en xsl es un conjunto de nodos. – Oded

5

No, no es como tal. El concepto más cercano es el conjunto de nodos, que son colecciones de nodos. Siempre que el resultado de una selección sea una cantidad de nodos, se obtiene un conjunto de nodos. Se puede acceder a estos con una notación de índice (comenzando con 1), de modo que se puede acceder al primer elemento del conjunto de nodos con notación como selectedNodes[1].

+0

Creo que esto no es del todo correcto. Verifica mi respuesta. –

6

el 2,0 secuencia XPath (disponible en XSLT 2+) es lo más parecido a una matriz:

(1 to 10)[3] 

evalúa a 3

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

evalúa a 'a'

Los elementos de una secuencia puede ser de cualquier tipo concebible permitido en XPath, con la excepción de la secuencia en sí - secuencias anidadas no están permitidos.

hacer la nota: Las secuencias no son las mismas que las matrices:

  1. secuencias son inmutables. Cualquier operación de actualización en una secuencia (agregar o anteponer un elemento, insertar un elemento o eliminar un elemento) produce una nueva secuencia.

  2. El tiempo de acceso al elemento n-ésimo no se garantiza que sea O (1) ya que esto es para las matrices, y puede ser O (n).

+0

+1 ¡buena respuesta! Más tarde me di cuenta de que olvidé el tipo de datos de secuencia. Eché de menos defender la idea del modelado de datos. –

+0

@Alejandro: ¿Qué es "modelado de datos"? :) –

+0

Lo siento por mi en inglés. Debo decir Tipo de datos abstractos. –