xslt - visualizar - ¿Puede una plantilla XSL coincidir en los modos*TODOS*?
validaciones xsl (3)
¿Hay alguna forma de escribir una plantilla XSL 1.0 que coincida en todos los modos?
Sí, para hacer esto uno debe seguir estas dos reglas :
Escribe tu plantilla sin un atributo de modo .
Dentro de las plantillas modificadas tienen una instrucción
<xsl:apply-templates>
sin un atributo de modo que dará como resultado que la plantilla en 1. arriba se seleccione para el procesamiento
Esto sigue directamente de la especificación XSLT 1.0 , que dice :
Si un elemento
xsl:apply-templates
tiene un atributo demode
, entonces se aplica solo a las reglas de plantilla dexsl:template
elementos dexsl:template
que tienen un atributo demode
con el mismo valor; si un elementoxsl:apply-templates
no tiene un atributo demode
, entonces se aplica solo a las reglas de plantilla dexsl:template
elementos dexsl:template
que no tienen un atributo demode
.
Para resumir : un conjunto de plantillas, cada una en un modo diferente, aún puede emitir <xsl:apply-templates>
de tal manera (descrito anteriormente), de modo que se seleccionará la misma plantilla única específica para el procesamiento en cada caso.
¿Hay alguna manera de escribir una plantilla XSL 1.0 que coincida en todos los modos?
¿O tengo que escribir una plantilla separada para cada modo existente (incluidas las plantillas adicionales para los modos que se agreguen en el futuro)?
Esto es lo que tengo:
<xsl:apply-templates mode="mode1" />
...
<xsl:apply-templates mode="mode2" />
...
<!-- Do not process text content of nodes no matter in what mode -->
<!-- Is there a way to have only one template here? -->
<xsl:template match="text()" mode="mode1" />
<xsl:template match="text()" mode="mode2" />
El modo predefinido: #all
(solo disponible en XSLT 2.0).
editar: replicar el comportamiento del modo compartido con 1.0
<xsl:template match="/">
<xsl:variable name="choice" select="''a''"/><!-- input seed here -->
<xsl:choose>
<xsl:when test="$choice=''a''">
<xsl:apply-templates mode="a"/>
</xsl:when>
<xsl:when test="$choice=''b''">
<xsl:apply-templates mode="b"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="a">
[A]
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*" mode="b">
[B]
<xsl:apply-templates />
</xsl:template>
<xsl:template match="text()">
[ALL]
</xsl:template>
Si desea que la plantilla coincida en todos los modos, ¿por qué está utilizando el modo? Si no usa el modo, la plantilla se usará todo el tiempo. El motivo del modo es realizar de manera condicional cosas diferentes con el mismo tipo de datos. Parece que quieres ser no modal.