Uf, uf, uf y recontra uf!

:
Primero, aunque sabía no iba por ahí, me puse a buscar sobre el reemplazo de cadenas (no va por ahí porque es otro nodo XML, no es solo una cadena) con la esperanza de encontrar algo. Me topé con la función translate(), pero ésta solo reemplaza caracteres, pero teniendo más noción recurrí a Google y encontré una
función para remplazar cadenas con xsl que solo copié y pegué (haciendo caso de las instrucciones

):
Código xml:
Ver original<xsl:template name="replace-string">
<xsl:param name="text"/>
<xsl:param name="from"/>
<xsl:param name="to"/>
<xsl:choose>
<xsl:when test="contains($text, $from)">
<xsl:variable name="before" select="substring-before($text, $from)"/>
<xsl:variable name="after" select="substring-after($text, $from)"/>
<xsl:variable name="prefix" select="concat($before, $to)"/>
<xsl:value-of select="$before"/>
<xsl:value-of select="$to"/>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$after"/>
<xsl:with-param name="from" select="$from"/>
<xsl:with-param name="to" select="$to"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Para utilizarla, hay que invocar el template de la siguiente manera:
Código xml:
Ver original<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="path/del/nodo"/>
<xsl:with-param name="from" select="'textoAbuscar'"/>
<xsl:with-param name="to" select="'textoParaReemplazar'"/>
</xsl:call-template>
Entonces, yo solo tomo el contenido del nodo, y lo reemplazo por sí mismo concatenado con el BBCode correspondiente (se me ocurrió, cualquier otra idea es bienvenida). Entonces, el XSL me quedó de la siguiente manera:
Código xml:
Ver original<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="seccion">
[TITLE]<xsl:value-of select="title"/>[/TITLE]
<xsl:variable name="def" select="para/def" />
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="normalize-space(para)"/>
<xsl:with-param name="from" select="$def"/>
<xsl:with-param name="to" select="concat('[DEF]',$def,'[/DEF]')"/>
</xsl:call-template>
</xsl:template>
<!--
Template para reemplazar cadenas.
[url]http://www.nectil.com/Public/ManualText.php?ID=2586&manualID=2547[/url]
-->
<xsl:template name="replace-string">
<xsl:param name="text"/>
<xsl:param name="from"/>
<xsl:param name="to"/>
<xsl:choose>
<xsl:when test="contains($text, $from)">
<xsl:variable name="before" select="substring-before($text, $from)"/>
<xsl:variable name="after" select="substring-after($text, $from)"/>
<xsl:variable name="prefix" select="concat($before, $to)"/>
<xsl:value-of select="$before"/>
<xsl:value-of select="$to"/>
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$after"/>
<xsl:with-param name="from" select="$from"/>
<xsl:with-param name="to" select="$to"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Y así es que consigo el objetivo buscado... quedo tranquilo por ahora. Ojalá a alguien más le sirva, cualquier comentario bienvenido.