2012-03-29 17 views
5

¿Hay alguna manera de restringir una sección de XSLT a un solo nodo, de modo que la ruta completa del nodo no sea necesaria cada vez?Sección de restricción de XSLT al nodo único

Por ejemplo ...

Name: <xsl:value-of select="/root/item[@attrib=1]/name"/> 
Age: <xsl:value-of select="/root/item[@attrib=1]/age"/> 

Esto podría hacerse a través de una para-cada comando, pero me lleva a creer que estos deben ser evitados si es posible ...

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

Supongo que estoy preguntando si hay un equivalente XSLT del comando VB.NET With?

Preferiría evitar la plantilla xsl: para legibilidad, ya que el archivo XSLT en cuestión es grande, pero me complace aceptar si esa es la única forma de hacerlo. Y si es así, ¿cuál es la sintaxis para llamar a una plantilla particular basada en un nodo específico?

actualización

En seguimiento a la respuesta por @javram, es posible hacer coincidir plantillas separadas en base a determinados atributos/nodos.

<xsl:apply-templates select="/root/item[@attrib=1]"/> 
<xsl:apply-templates select="/root/item[@attrib=2]"/> 

<xsl:template match="/root/item[@attrib=1]"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 

<xsl:template match="/root/item[@attrib=2]"> 
    Foo: <xsl:value-of select="foo"/> 
</xsl:template> 
+0

No hay nada de malo en usar 'xsl: for-each' como lo hace aquí. En este caso, funciona bien de una manera "con". Las personas aconsejan no usar 'xsl: for-each' para repetir explícitamente algo cuando XSLT proporciona mejores formas de hacer el equivalente, como dejar que las plantillas se apliquen y coincidan. –

+0

Downvoter ... ¿puedo preguntar por qué, y después de tanto tiempo? – freefaller

+0

Downvoter ... no, no lo creo ... solo te escondes detrás del anonimato de SO, en lugar de ser constructivo. Gracias, muchas gracias! – freefaller

Respuesta

2

La forma correcta sería utilizar una plantilla:

<xsl:apply-templates select="/root/item[@attrib=1]"/> 

. 
. 
. 

<xsl:template match="/root/item"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 
+0

Aunque no es tan agradable como un bloque de tipo "Con", creo que tienes razón en que esta es la forma correcta de hacerlo. Como las siguientes preguntas no están permitidas a través de los comentarios, ¿serías tan amable de mostrar cómo coincidirías con una plantilla diferente si se cambiara @attrib?Actualizaré mi pregunta para reflejar esta solicitud – freefaller

+0

Ignore la pregunta de seguimiento, fue bastante más fácil de lo que pensaba, actualicé mi pregunta adecuadamente – freefaller

+0

En su actualización de seguimiento, también podría haber hecho: que habría guardado una línea de código. Como el atributo ya estaba incluido en los criterios de coincidencia por separado, ambas plantillas seguirían siendo afectadas. – javram

2

Es posible utilizar variables:

<xsl:variable name="foo" select="/root/item[@attrib=1]" /> 

<xsl:value-of select="$foo/name" /> 
<xsl:value-of select="$foo/age" /> 
+0

No tenía idea de que las variables también podrían contener nodos, gracias por esto. – freefaller

0

En XSLT 2.0 otro estilo posible es:

<xsl:value-of select='/root/item[@attrib=1]/ 
         concat("Name: ", name, " Age: ", age)'/> 
+0

Desafortunadamente todavía estamos en 1.0, y el bloque que cubre "Con" es demasiado grande para que "concat" sea útil. Pero aprecio la entrada, gracias. – freefaller

0

Esto:

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

desciende en todos los nodos (cada nodo coincidente, uno por uno).

Este:

<xsl:for-each select="(/root/item[@attrib=1])[1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

descensos al primero (posiblemente única) nodo de juego y es equivalente a VB.NET With declaración como usted deseaba.

Cuestiones relacionadas