xsl www w3schools tutorial example español xslt tags

www - xslt templates



¿Cómo puedo verificar si existe una etiqueta en XSLT? (2)

<xsl:if test="one"> <h2>one</h2> <xsl:apply-templates select="one"/> </xsl:if> <!-- etc -->

Alternativamente, puede crear una plantilla con nombre,

<xsl:template name="WriteWithHeader"> <xsl:param name="header"/> <xsl:param name="data"/> <xsl:if test="$data"> <h2><xsl:value-of select="$header"/></h2> <xsl:apply-templates select="$data"/> </xsl:if> </xsl:template>

y luego llamar como:

<xsl:call-template name="WriteWithHeader"> <xsl:with-param name="header" select="''one''"/> <xsl:with-param name="data" select="one"/> </xsl:call-template>

Pero para ser honesto, eso me parece más trabajo ... solo útil si dibujar un encabezado es complejo ... para un simple <h2>...</h2> estaría tentado de dejarlo en línea.

Si el título del encabezado siempre es el nombre del nodo, puede simplificar la plantilla eliminando el argumento "$ header" y usar en su lugar:

<xsl:value-of select="name($header[1])"/>

Tengo la siguiente plantilla

<h2>one</h2> <xsl:apply-templates select="one"/> <h2>two</h2> <xsl:apply-templates select="two"/> <h2>three</h2> <xsl:apply-templates select="three"/>

Me gustaría mostrar solo los encabezados (uno, dos, tres) si hay al menos un miembro de la plantilla correspondiente. ¿Cómo reviso esto?


Me gusta ejercitar los aspectos funcionales de XSL que me llevan a la siguiente implementación:

<?xml version="1.0" encoding="UTF-8"?>

<!-- test data inlined --> <test> <one>Content 1</one> <two>Content 2</two> <three>Content 3</three> <four/> <special>I''m special!</special> </test> <!-- any root since take test content from stylesheet --> <xsl:template match="/"> <html> <head> <title>Header/Content Widget</title> </head> <body> <xsl:apply-templates select="document('''')//test/*" mode="header-content-widget"/> </body> </html> </xsl:template> <!-- default action for header-content -widget is apply header then content views --> <xsl:template match="*" mode="header-content-widget"> <xsl:apply-templates select="." mode="header-view"/> <xsl:apply-templates select="." mode="content-view"/> </xsl:template> <!-- default header-view places element name in <h2> tag --> <xsl:template match="*" mode="header-view"> <h2><xsl:value-of select="name()"/></h2> </xsl:template> <!-- default header-view when no text content is no-op --> <xsl:template match="*[not(text())]" mode="header-view"/> <!-- default content-view is to apply-templates --> <xsl:template match="*" mode="content-view"> <xsl:apply-templates/> </xsl:template> <!-- special content handling --> <xsl:template match="special" mode="content-view"> <strong><xsl:apply-templates/></strong> </xsl:template>

Una vez en el cuerpo, todos los elementos contenidos en el elemento de prueba tienen un encabezado-contenido-widget aplicado (en orden de documento).

La plantilla predeterminada encabezado-contenido-widget (que coincide con "*") primero aplica una vista de encabezado y luego aplica una vista de contenido al elemento actual.

La plantilla de vista de encabezado predeterminada coloca el nombre del elemento actual en la etiqueta h2. La vista de contenido predeterminada aplica reglas de procesamiento genéricas.

Cuando no hay contenido según lo juzgado por el predicado [not (text ())], no se produce salida para el elemento.

Uno de los casos especiales se maneja fácilmente.