Si queremos reemplazar el carácter de salto de linea por un tag html “BR” de un texto podemos emplear el siguiente template, el parser xsl reconocerá el salto de linea como ‘
’
<xsl:template name="break">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text, '
')">
<xsl:value-of select="substring-before($text, '
')"/>
<br/>
<xsl:call-template name="break">
<xsl:with-param name="text" select="substring-after($text, '
')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Nota:
'
' nueva linea
'	' TAB
'
' retorno de carro
Si lo que necesitamos es un template buscar y reemplazar una cadena de texto por otra cadena de texto, podemos utilizar el siguiente:
<xsl:template name="string-replace-all">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="by"/>
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$by"/>
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="by" select="$by"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Por ejemplo, sea nuestro xml:
<?xml version="1.0"?>
<pagina>
<texto>El primer parrafo.El segundo parrafo.El tercer parrafo.</texto>
</pagina>
Y para invocar el template podriamos citar el siguiente ejemplo para reemplazar la palabra “parrafo” por “guion”:
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="pagina/texto"/>
<xsl:with-param name="replace" select="'parrafo'"/>
<xsl:with-param name="by" select="'guion'"/>
</xsl:call-template>
Si lo que necesitamos es un template buscar y reemplazar una cadena de texto por un elemento html (por ejemplo: BR, SPAN, etc.), podemos utilizar el siguiente:
<xsl:template name="string-replace-all-by-element">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="by"/>
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:copy-of select="$by"/>
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="by">
<xsl:copy-of select="$by"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Por ejemplo, sea nuestro xml:
<?xml version="1.0"?>
<pagina>
<texto>El primer parrafo.-El segundo parrafo.-El tercer parrafo.--Final.</texto>
</pagina>
Y para invocar el template podriamos citar el siguiente ejemplo para reemplazar los guiones por elementos html “BR”:
<xsl:call-template name="string-replace-all-by-element">
<xsl:with-param name="text" select="pagina/texto"/>
<xsl:with-param name="replace" select="'-'"/>
<xsl:with-param name="by">
<xsl:element name="br"></xsl:element>
</xsl:with-param>
</xsl:call-template>
Estos ejemplos son para la XPATH 1.0, pero para la XPATH 2.0 ya tiene la funcion nativa replace con la cual no necesitas del template, la forma de invocarla seria tan sencilla como esto:
<xsl:value-of select="replace(pagina/texto,'parrafo','guion')"/>
Mas info:
XQuery 1.0 y XPath 2.0 operadores y funciones
http://www.w3.org/TR/xpath-functions/
Sintaxis XML canonico
http://www.w3.org/TR/2000/WD-xml-c14n-20000119.html











