Llevo un par de días aprendiendo XSLT, que, para aquellos que no lo sepan es un lenguaje que sirve, dios santo, para transformar documentos XML en otros documentos XML.
Y mira por donde, resulta que para una mente enferma y enfermiza como la mía, no es una cosa difícil de aprender. Pero:
Entre las funciones disponibles (que son las propias de XSLT más las correspondientes a XPath, no hay ninguna que permita la sustitución de cadenas.
Así que, ayer, enfrentado al reto de realizar ciertos reemplazos, gugleé y gugleé y encontré una plantilla que hacía precisamente eso, sustituir cadenas. Pero como uno no es hábil todos los días, olvidé añadir a mis marcadores la página donde la encontré. Como consecuencia inevitable, esta mañana cuando me he puesto de nuevo a trabajar de nuevo en el asunto que me ocupaba, la dichosa paginita no aparecía.
Pues nada, ni corto ni perezoso, me he puesto a desarrollar mi propia versión. Éste es el resultado:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="str-replace">
<xsl:param name="input"/>
<xsl:param name="from"/>
<xsl:param name="to"/>
<xsl:choose>
<xsl:when test="contains($input, $from)">
<xsl:call-template name="str-replace">
<xsl:with-param name="input">
<xsl:value-of select="substring-before($input, $from)"/>
<xsl:value-of select="$to"/>
<xsl:value-of select="substring-after($input, $from)"/>
</xsl:with-param>
<xsl:with-param name="from">
<xsl:value-of select="$from"/>
</xsl:with-param>
<xsl:with-param name="to">
<xsl:value-of select="$to"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$input"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Que, por supuesto, puedes copipegar sin ninguna garantía. Para no quedarnos cortos, así es como se utilizaría dentro de otra hoja de estilos XSLT:
<!-- esta vez no incluyo la hoja completa -->
...
<xsl:include href="str-replace.xsl"/>
...
<xsl:template match="cif">
<xsl:call-template name="str-replace">
<xsl:with-param name="input">
<xsl:value-of select="."/>
</xsl:with-param>
<xsl:with-param name="from"> <!-- sustituiremos el guión por la nada más absoluta -->
-
</xsl:with-param>
<xsl:with-param name="to"/> <!-- la nada más absoluta -->
</xsl:call-template>
</xsl:template>
Para terminar, ¿recuerdas aquello de «si no quieres ser como él, lee»? Bueno, pues en este caso vamos a hacer un si quieres ser como Choan, lee:
- Tutoriales sobre lenguajes XSL en W3 Schools;
- XSL Transformations (capítulo 17 de La biblia de XML, segunda edición), en Café con leche.
Todo ello en inglés.
Nota: Nueve de cada diez seres racionales recomiendan no ser como Choan.

