2010-05-22 17 views
8

necesito para transformar el siguiente documento XML:XSLT: nodos de cambio de texto interior

<a> 
    <b/> 
    <c/> 
    myText 
</a> 

en esto:

<a> 
    <b/> 
    <c/> 
    differentText 
</a> 

Por lo tanto, he escrito este documento XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" /> 

    <xsl:template match="https://stackoverflow.com/a/text()"> 
    <a> 
     <b/> 
     <c/> 
     differentText 
    </a> 
</xsl:template> 
</xsl:stylesheet> 

Este manera, me sale el siguiente resultado:

<?xml version="1.0" encoding="utf-8"?> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 

El resultado aparece repetido 3 veces porque se están realizando 3 coincidencias ... ¿Por qué? Podría arreglarlo? Gracias

+0

Buena pregunta (+1). Vea mi respuesta para una solución mejor y más simple, que no requiere ningún predicado en la expresión de coincidencia de la plantilla específica. –

Respuesta

8

Excluir los nodos de texto whtespace-solamente. Conozca y use la instrucción <xsl:strip-space>.

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="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="a/text()"> 
    <xsl:text>Diferent text</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica al documento XML proporcionado, produce el resultado correcto querido.

No hay necesidad de predicados complicados en la expresión del partido de la plantilla específica!

Deberíamos esforzarnos por encontrar la solución más simple, más corta, más elegante, más legible y más comprensible que emplee todo el poder del idioma.

Lo más probable es que tal solución sea más comprendida, más fácil de implementar y más probable sea optimizada por cualquier procesador XSLT, lo que resulta en una implementación más eficiente.

+0

Por cierto, no considero '[normalize-space()! = '']' Un predicado particularmente complicado. ;) – Tomalak

+0

@Tomalak: debemos esforzarnos por la solución más simple, más corta, más elegante, más legible y más comprensible que emplee todo el poder del lenguaje. Lo más probable es que dicha solución sea más comprendida, más fácil de implementar y más probable sea optimizada por cualquier procesador XSLT, lo que resulta en una implementación más eficiente. :) –

6

Hay son tres partidos, como se destaca en corchetes:

<a>[ 
    ]<b/>[ 
    ]<c/>[ 
    myText 
]</a> 

quieres algo así como:

<xsl:template match="https://stackoverflow.com/a/text()[normalize-space() != '']"> 
+0

Como se muestra en mi respuesta, no hay predicados necesarios en la expresión de coincidencia. :) –

+4

@Dimitre: lo sé. Mi respuesta proporciona el menor cambio posible al código existente. Se basa en la suposición de que el código real es más complejo y '' puede causar efectos secundarios en otros lugares. – Tomalak

+0

@Tomalak: Suponer que lo que el OP no ha dicho a menudo hace que la solución sea subóptima y más difícil de entender, incluso confusa. Yendo de esta manera, podemos terminar diciendo todo lo que sabemos sobre XSLT - "por las dudas ..." :) –

Cuestiones relacionadas