Sigo con mis trabajitos sobre XML y XSLT. Detallo: estoy haciendo unos programitas que:
- extraen información de la base de datos (el SGBD es Informix, por cierto) y generan un informe en XML (llamémosle
informe.xml); - el informe en XML se procesa mediante XSLT para generar un fichero de texto marcado con XPress Tags (que es un lenguaje de marcado para QuarkXPress). Llamemos al fichero resultado
informe.xtg; - en un archivo de QuarkXPress con estilos ya definidos, se importa el fichero
informe.xtg. Como todo el texto viene marcado y los estilos ya están definidos, los ajustes que habrá que realizar a manubrio serán mínimos.
El problema que me ha surgido hoy es que algunos de los campos de la base de datos contienen el símbolo & (ampersand), que se da de patadas con el procesador XML (por cierto, utilizo XMLStarlet y va la mar de bien). Así que algo había que hacer.
Lo primero que se me ha ocurrido es sustituir esos & por & al grabar el contenido del campo. Para ello tendría que escribir una función que hiciera la sustitución. Escribirla no supone ninguna complicación, pero ¿andar llamándola cada dos líneas? Demasiado tecleo para un programador.
Así que luego he pensado, «leñe, ¿y si hago la sustitución después?» Venga, pues vamos a ver cómo lo hacemos:
$ man sed
Leo y releo y veo que la sintaxis para realizar una sustitución es esta:
$ sed -e s/patron_de_búsqueda/reemplazo/ fichero_de_entrada
Venga, pues vamos allá, escribo:
$ sed -e s/&/&/ informe.xml
Horor de los horrores, la ejecución de dicho comando resulta en el mensaje no se puede analizar la función s/. Le echo otra ojeada al manual (man sed) y veo que el caracter & tiene un significado especial dentro de la cadena de reemplazo. Pues nada, habrá que escaparlo:
$ sed -e s/&/\&/ informe.xml
Nada, que ni flores, que no chuta. Sigamos escapando:
$ sed -e s/\&/\&/ informe.xml
Um, no todavía no hemos dado con lo que buscábamos, ahora el mensaje es No se puede analizar la función s/&/&. Deduzco que ahora debería escapar el punto y coma:
$ sed -e s/\&/\&\;/ informe.xml
Hecho. Quede aquí explicado para futura referencia.
Y dicho esto, me escapo a comer.

