Dizque



Programando, XML y sus sabores

Sustitución de cadenas en XSLT

Saltar a Anotaciones relacionadas

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:

Todo ello en inglés.

Nota: Nueve de cada diez seres racionales recomiendan no ser como Choan.




Di la tuya

Puedes usar markdown y estas etiquetas HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> . Por favor, evita el abuso de las mayúsculas y cuida la ortografía.