2010-06-27 46 views
46

Acabo de aprender XML y cómo usar archivos XSL. En un archivo XSL me encontré con el siguiente término:XSL xsl: template match = "/"

xsl:template match="/" 

Lo que hace esto significa? ¿Y qué podría usar en lugar del /? ¿Podría escribir table o alguna otra etiqueta HTML en lugar de /?

Respuesta

7

El atributo de coincidencia indica en qué partes se va a aplicar la transformación de la plantilla. En ese caso particular, "/" significa la raíz del documento xml. El valor que debe proporcionar en el atributo de coincidencia debe ser la expresión XPath. XPath es el idioma que debe usar para referir partes específicas del archivo xml de destino.

Para obtener una comprensión significativa de qué más se puede poner en el atributo de coincidencia, debe comprender qué es xpath y cómo usarlo. Sugiero que mires los enlaces que he proporcionado para ti en la parte inferior de la respuesta.

¿Podría escribir "tabla" o cualquier otra etiqueta html en lugar de "/"?

Sí se puede. Pero esto depende de qué es exactamente lo que estás tratando de hacer. si el archivo xml de destino contiene elementos HMTL y está intentando aplicar esta plantilla xsl: en ellos, tiene sentido usar table, div o anithing else.

Aquí algunos enlaces:

+2

Esta respuesta no es en realidad correcta. No todas las expresiones XPath se pueden especificar como un patrón legal de coincidencia. –

+1

Estoy de acuerdo, pero en mi opinión, es mejor para un principiante considerar el patrón de coincidencia tal como se define con XPath. – Koynov

108

El valor del atributo match de la instrucción <xsl:template> debe ser un coincide con el patrón.

Los patrones de coincidencia forman un subconjunto del conjunto de todas las expresiones XPath posibles. La primera limitación natural es que un patrón de coincidencia debe seleccionar un conjunto de nodos. También hay otras limitaciones. En particular, los ejes inversos no están permitidos en los pasos de ubicación (pero se pueden especificar dentro de los predicados). Además, no se permiten referencias de variables o parámetros en XSLT 1.0, pero su uso es legal en XSLT 2.x.

/ en XPath denota el raíz o nodo de documento. En XPath 2.0 (y, por lo tanto, XSLT 2.x), esto también se puede escribir como document-node().

Un patrón de coincidencia puede contener el // abbreviation.

Ejemplos de patrones de partido:

<xsl:template match="table"> 

se puede aplicar sobre cualquier elemento llamado table.

<xsl:template match="x/y"> 

se puede aplicar en cualquier elemento llamado y cuyo padre es un elemento llamado x.

<xsl:template match="*"> 

se puede aplicar a cualquier elemento.

<xsl:template match="/*"> 

se puede aplicar solo al elemento superior de un documento XML.

<xsl:template match="@*"> 

se aplica a cualquier atributo.

<xsl:template match="text()"> 

se puede aplicar a cualquier nodo de texto.

<xsl:template match="comment()"> 

se puede aplicar a cualquier nodo de comentario.

<xsl:template match="processing-instruction()"> 

se puede aplicar a cualquier nodo instrucción de procesamiento.

<xsl:template match="node()"> 

se puede aplicar a cualquier nodo: elemento, texto, comentario o instructon de procesamiento.

+0

Eso fue útil para conocer y rara vez se menciona en otras fuentes: "Un nodo coincide con un patrón si el nodo es un miembro del resultado de evaluar el patrón como una expresión con respecto a un contexto posible; los posibles contextos son aquellos cuyo contexto nodo es el nodo que está siendo emparejado o uno de sus antepasados ​​". (https://www.w3.org/TR/xslt#patterns) –

+0

@NiklasPeter, sí, aquí la especificación explica un poco cómo se evalúan las expresiones XPath, por lo que debemos mencionar que se espera cualquier programador XSLT para saber XPath? Creo que todo el mundo está al tanto de este requisito previo. –

+0

La razón por la que agregué esta cita es la última parte de ella: "los contextos posibles son aquellos cuyo nodo de contexto es el nodo que está siendo emparejado o uno de sus antecesores".Creo que probar todos los nodos de antepasados ​​es específico de XSLT y no un hecho, que no todos se sienten cómodos con XPath. –

34

Vale la pena señalar, ya que es confuso para las personas nuevas en XML, que el nodo raíz (o documento) de un documento XML no es el elemento de nivel superior. Es el padre del elemento de nivel superior. Esto es confuso porque no parece que el elemento de nivel superior pueda tener un padre. ¿No es el nivel superior?

Pero mira esto, un documento XML bien formado:

<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?> 
<!-- Comments and processing instructions are XML nodes too, remember. --> 
<TopLevelElement/> 

La raíz de este documento tiene tres hijos: una instrucción de procesamiento, un comentario, y un elemento.

Así, por ejemplo, si desea escribir una transformación que se deshizo de ese comentario, pero que quedan en los comentarios que aparecen en cualquier otra parte del documento, deberá añadir esto a la identidad transformar:

<xsl:template match="/comment()"/> 

Incluso más simple (y más comúnmente útil), aquí hay un patrón XPath que coincide con el elemento de nivel superior del documento, independientemente de su nombre: /*.

+3

He pasado una buena parte de esta mañana completamente desconcertado por esta dicotomía documento/elemento raíz. He estado usando XML y DOM durante años, ¡pero todavía tropecé con cosas como esta! –

+1

¡Gracias por dejarme entrar en esta sutil pero elemental distinción de la que no me di cuenta por demasiado tiempo! :) – Chris