2010-07-29 25 views
62

Hola, he realizado una transformación que arroja una etiqueta si es nula.¿Por qué XSLT genera todos los textos por defecto?

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 OUTPUT, si es nulo, entonces el segundo XSLT debería generar un texto "ENCONTRADO". (Que en realidad no necesito algún tipo XML de salida, pero sólo estoy usando XSLT para la búsqueda.)

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> 

Se da salida a todos los datos de texto que se presente en el archivo XML,

para evitar esto, tuve que escribir el 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 ex salidas de código de texto, ¿por qué debería insistir XSL para ignorar el resto del texto? es ese el comportamiento de todos los analizadores XML o solo el mío (estoy usando msxml parser).

Respuesta

124

¿Por qué el ex salidas de código de texto, ¿por qué debería insistir XSL para ignorar todos los demás texto? es que el comportamiento de todos los analizadores XML o solamente de mi propia

Están descubriendo una de las características más fundamentales XSLT como se especifica en el pliego de condiciones: la built-in templates of XSLT.

De the Spec:

Hay una regla integrada de plantilla para permitir el procesamiento recursivo para continuar en ausencia de un exitoso ajuste de patrones por 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 . Lo siguiente muestra la equivalente de la plantilla integrada regla:

<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

También hay una regla plantilla incorporada para cada modo, que permite recursiva procesamiento para continuar en la misma modo en el ausencia de una coincidencia de patrón exitosa mediante una plantilla explícita regla en la hoja de estilo. Esta regla de plantilla se aplica a ambos nodos de elementos 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 el texto y los nodos de atributo que copias de texto a través de:

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

La regla integrada de plantilla para instrucciones de elaboración y comentarios consiste en hacer nada.

<xsl:template match="processing-instruction()|comment()"/> 

La regla plantilla incorporada para nodos espacio de nombres es también no hacer 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 para los nodos de espacio de nombres .

Las reglas plantilla incorporadas se tratados como si fueran importados implícitamente antes de la hoja de estilo y por lo que tienen menor prioridad que la importación todas las demás reglas de plantilla. Por lo tanto, el autor puede anular una regla de plantilla incorporada al incluir una regla de plantilla explícita.

Por lo tanto, el comportamiento informado es el resultado de la aplicación de las plantillas incorporadas: la 1ra y la 2da de las tres.

Es un buen patrón de diseño XSLT para anular las plantillas incorporadas con su propia que emitirá un mensaje de error cada vez que llama para que el programador sabe de inmediato su transformación se "fuga":

Para ejemplo, si existe 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 verá muy confusa cómo apareció el texto deseado.

Sin embargo, sólo la adición de este catch-all template ayuda a evitar cualquier confusión y captura tales errores inmediatamente:

<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 confuso el programador recibe una advertencia que explica el problema de inmediato:

WARNING: Unmatched element: c 
+4

+1: Gran explicación: mucho más completa que la respuesta aceptada, aunque la respuesta aceptada también responde a la pregunta específica. –

+0

@donroby: Gracias. ¿Por qué mi respuesta no abordaría la pregunta y la respondería? Cualquiera que tenga este problema y lea mi respuesta comprenderá la causa de su problema y podrá solucionarlo. –

+0

@donroby: Mi respuesta proporciona una respuesta exacta: '" Por lo tanto, el comportamiento informado es el resultado de la aplicación de las plantillas incorporadas - el 2 de los tres "' –

12

Hay varias built in template rules en XSL, uno de los cuales es la siguiente:

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

Genera texto.

+0

gracias, ¿es específico para el analizador en particular, o en general? –

+0

Supongo que es su regla general para todos los analizadores porque es su especificación w3c. bien, gracias :) –

+1

@infant programador - está en la especificación, como habrás notado ...todos los analizadores XSL tienen que implementarlos. – Oded

Cuestiones relacionadas