online - ¿Por qué XSLT genera todos los textos por defecto?
xslt online (2)
Hola, realicé una transformación que arroja una etiqueta si es nula.
Quería comprobar si mi transformación funciona bien, así que en lugar de verificarla manualmente, escribí un código XSLT más que solo comprueba la presencia de esa etiqueta en particular en el XML de OUTPUT, si es nulo, entonces el segundo XSLT debería generar un resultado. texto "ENCONTRADO". (En realidad, no necesito algún tipo de salida XML, pero solo estoy usando XSLT para buscar).
Cuando probé con este código XSL ::
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/SiebelMessage//SuppressCalendar[.!='''']">
FOUND
</xsl:template>
</xsl:stylesheet>
Emite todos los DATOS DE TEXTO que están presentes en el archivo XML,
para evitar eso, tuve que escribir este código ::
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/SiebelMessage//SuppressCalendar[.!='''']">
FOUND
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
¿Por qué el código anterior genera TEXTO? ¿Por qué debería insistir en que XSL ignore todo el resto del texto? es ese el comportamiento de todos los analizadores XML o solo el mío (estoy usando msxml parser).
¿Por qué el código anterior genera TEXTO? ¿Por qué debería insistir en que XSL ignore todo el resto del texto? es ese el comportamiento de todos los analizadores XML o solo el mío
Está descubriendo una de las funciones XSLT más fundamentales tal como se especifica en la Especificación: las plantillas integradas de XSLT .
De la especificación :
Existe una regla de plantilla incorporada para permitir que el procesamiento recursivo continúe en ausencia de una coincidencia de patrón exitosa mediante una regla de plantilla explícita en la hoja de estilo. Esta regla de plantilla se aplica a los nodos de elemento y al nodo raíz. A continuación, se muestra el equivalente de la regla de plantilla incorporada:
<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template>
También hay una regla de plantilla incorporada para cada modo, que permite que el procesamiento recursivo continúe en el mismo modo en ausencia de una coincidencia de patrón exitosa mediante una regla de plantilla explícita en la hoja de estilo. Esta regla de plantilla se aplica a los nodos de elemento y al nodo raíz. A continuación, se muestra el equivalente de la regla de plantilla incorporada para el modo m.
<xsl:template match="*|/" mode="m"> <xsl:apply-templates mode="m"/> </xsl:template>
También hay una regla de plantilla incorporada para los nodos de texto y de atributos que copia el texto a través de:
<xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template>
La regla de plantilla incorporada para procesar instrucciones y comentarios es no hacer nada.
<xsl:template match="processing-instruction()|comment()"/>
La regla de plantilla incorporada para los nodos de espacio de nombres tampoco sirve para nada. No hay ningún patrón que pueda coincidir con un nodo de espacio de nombres; por lo tanto, la regla de plantilla incorporada es la única regla de plantilla que se aplica a los nodos de espacio de nombres.
Las reglas de la plantilla incorporada se tratan como si se importasen implícitamente antes de la hoja de estilo y, por lo tanto, tienen una prioridad de importación menor que todas las demás reglas de la plantilla. Por lo tanto, el autor puede anular una regla de plantilla incorporada al incluir una regla de plantilla explícita.
Entonces, el comportamiento reportado es el resultado de la aplicación de las plantillas integradas: la 1ra y la 2da de las tres.
Es un buen patrón de diseño XSLT para anular las plantillas integradas con las suyas que emitirán un mensaje de error cada vez que se lo llame para que el programador sepa inmediatamente que su transformación está "goteando":
Por ejemplo , si hay este documento XML:
<a>
<b>
<c>Don''t want to see this</c>
</b>
</a>
y se procesa con esta transformación :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a|b">
<xsl:copy>
<xsl:attribute name="name">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
el resultado es :
<a name="a">
<b name="b">Don''t want to see this</b>
</a>
y el programador se confundirá en gran medida de cómo apareció el texto no deseado.
Sin embargo, el solo hecho de agregar esta catch-all template
ayuda a evitar dicha confusión y a detectar errores de forma inmediata :
<xsl:template match="*">
<xsl:message terminate="no">
WARNING: Unmatched element: <xsl:value-of select="name()"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
Ahora, además de la salida confusa, el programador recibe una advertencia que explica el problema de inmediato :
WARNING: Unmatched element: c
Hay varias reglas de plantilla incorporadas en XSL, una de las cuales es esta:
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Emite texto.