2011-02-17 23 views
5

La función normalize-space quita el espacio en blanco inicial y final y reemplaza las secuencias de caracteres en espacios en blanco por un espacio simple. ¿Cómo puedo solo reemplaza las secuencias de caracteres en espacios en blanco por un espacio simple en XSLT 1.0? Por ejemplo, "..x.y...\n\t..z." (espacios reemplazados por un punto para facilitar la lectura) debe convertirse en ".x.y.z.".¿Cómo puedo reemplazar secuencias de espacios en blanco por un espacio pero no recortar en XSLT?

+0

Buena pregunta, 1. Vea mi respuesta para una solución de una línea de XPath 1.0 - solución (y, por supuesto, esta es también una solución XSLT 1.0, también). :) No se necesitan/utilizan funciones de extensión. –

+0

Verifique mi respuesta para una solución de llamadas de tres funciones. –

Respuesta

2

Sin método de Becker, se podría utilizar un poco de discouraged carácter de marca:

translate(normalize-space(concat('',.,'')),'','') 

Nota: función de tres llamadas ...

O con cualquier carácter pero repite alguna expresión:

substring(
    normalize-space(concat('.',.,'.')), 
    2, 
    string-length(normalize-space(concat('.',.,'.'))) - 2 
) 

En XSLT se puede declarar una variable fácilmente:

<xsl:variable name="vNormalize" select="normalize-space(concat('.',.,'.'))"/> 
<xsl:value-of select="susbtring($vNormalize,2,string-length($vNormalize)-2)"/> 
+0

Gracias, el uso de personajes desalentados es un truco ingenioso. Solo olvidaste el ';' después de cada entidad de personaje (o se perdió al editar). – Jakob

+0

@Jakob: De nada. También tienes razón: he olvidado el último ';' en entidades. Lo siento. –

7

Utilice esta XPath 1.0 expresión:

concat(substring(' ', 1 + not(substring(.,1,1)=' ')), 
     normalize-space(), 
     substring(' ', 1 + not(substring(., string-length(.)) = ' ')) 
    ) 

Para verificar esto, la siguiente 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="text()"> 
    <xsl:value-of select= 
    "concat(substring(' ', 1 + not(substring(.,1,1)=' ')), 
      normalize-space(), 
      substring(' ', 1 + not(substring(., string-length(.)) = ' ')) 
     ) 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en este documento XML:

<t> 
<t1> xxx yyy zzz </t1> 
<t2>xxx yyy zzz</t2> 
<t3> xxx yyy zzz</t3> 
<t4>xxx yyy zzz </t4> 
</t> 

produce el, resultado correcto deseada:

<t> 
    <t1> xxx yyy zzz </t1> 
    <t2>xxx yyy zzz</t2> 
    <t3> xxx yyy zzz</t3> 
    <t4>xxx yyy zzz </t4> 
</t> 
+0

+1 para una solución correcta. – Flack

+0

Gracias! Usaré el método de Alejandro aunque confíe en datos que no contengan un carácter especial. Ambas respuestas son útiles :-) – Jakob

+0

@Jacob: De nada. Supongo que eligió la respuesta de @ Alejandro porque dividió la expresión en variables y así lo hizo más comprensible. Usted debe saber que entre nosotros nos enorgullece proporcionar soluciones XPath de una sola línea :) –

Cuestiones relacionadas