xslt - transformar - xsl:for-each
¿Cómo pueden las plantillas xsl: apply coincidir solo con las plantillas que he definido? (3)
Tengo varias plantillas que coinciden con varios nodos en un documento xml. Si solo hago una
<xsl: apply-templates /> de alguna manera muestra de manera recursiva el texto de todos los nodos debajo. Solo quiero que coincida recursivamente con cualquier plantilla que haya definido. Cómo puedo hacer eso ?
Esto está sucediendo debido a las plantillas incorporadas en XSLT. XSLT tiene un par de plantillas integradas, que dicen:
- cuando aplica plantillas a un elemento, procesa sus elementos secundarios
- cuando aplica plantillas a un nodo de texto, dé su valor
Juntos, significa que si aplica plantillas a un elemento pero no tiene una plantilla explícita para ese elemento, entonces su contenido se procesa y finalmente termina con el texto que contiene el elemento.
Lea la explicación completa aquí: http://www.dpawson.co.uk/xsl/sect2/defaultrule.html
Puede anular las plantillas predeterminadas para los nodos de texto definiendo su propia plantilla y hacer que no haga nada.
<xsl:template match="text()" />
Este es probablemente el problema más frecuente que experimentan los programadores XSLT.
El comportamiento observado es exactamente cómo se debe comportar un procesador compatible con XSLT.
Tenga en cuenta que:
<xsl:apply-templates/>
es una abreviatura para:
<xsl:apply-templates select="child::node()"/>
y la existencia de las reglas de plantillas incorporadas . De acuerdo con la especificación XSLT 1.0 :
" 5.8 Reglas de plantillas incorporadas
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 "
--- Fin de la cotización de XSLT Spec ---
Por lo tanto, si el autor desea tener el control total del procesamiento XSLT, debe anular todas las plantillas incorporadas .
Por ejemplo, si no queremos que text()
nodos de text()
se copien a la salida, podemos hacer que se ignoren anulando la plantilla incorporada de la siguiente manera:
<xsl:template match="text()" />
puede establecer un modo para aplicar solo sus propias plantillas:
<xsl:template match="* | /" >
<xsl:apply-templates mode="myMode" />
</xsl:template>
<xsl:template match="somenode" mode="myMode">
<!-- do something here -->
</xsl:template>
Otra opción sería sobrescribir las reglas de plantillas incorporadas (ver p. Ej. http://unix.com.ua/orelly/xml/xmlnut/ch08_07.htm )