2008-10-12 66 views
9

I tienen la siguiente plantilla¿Cómo verifico si existe una etiqueta en XSLT?

<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 sólo para mostrar los encabezados (uno, dos, tres) si hay al menos un miembro de la plantilla correspondiente. ¿Cómo reviso esto?

+0

sea más exacto :) ¿Cuál es el archivo xml en el que desea utilizar esta plantilla? – kender

Respuesta

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

Como alternativa, puede crear una plantilla llamada,

<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, que se parece más trabajo para mí ... solo es útil si dibujar un encabezado es complejo ... para un simple <h2>...</h2> estaría tentado de dejarlo en línea.

Si el título de cabecera es siempre el nombre del nodo, se puede simplifiy la plantilla mediante la eliminación de la arg "$ cabecera", y utilizar en su lugar:

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

Quiero 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 las cuerpo todos los elementos contenidos en el elementoprueba tienen cabecera-content-widget de aplica (en orden documento).

El valor predeterminado cabecera-content-widget de plantilla (que coinciden con "*") primero se aplica una header-vista continuación, se aplica un contenido-view al elemento actual.

El valor predeterminado cabecera de vista plantilla 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 ninguna salida para el elemento.

One off special casos son fáciles de manejar.

Cuestiones relacionadas