Ver Mensaje Individual
  #4 (permalink)  
Antiguo 28/11/2008, 18:40
Avatar de jam1138
jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL

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
  1. <xsl:template name="replace-string">
  2.   <xsl:param name="text"/>
  3.   <xsl:param name="from"/>
  4.   <xsl:param name="to"/>
  5.  
  6.   <xsl:choose>
  7.     <xsl:when test="contains($text, $from)">
  8.  
  9.       <xsl:variable name="before" select="substring-before($text, $from)"/>
  10.       <xsl:variable name="after" select="substring-after($text, $from)"/>
  11.       <xsl:variable name="prefix" select="concat($before, $to)"/>
  12.  
  13.       <xsl:value-of select="$before"/>
  14.       <xsl:value-of select="$to"/>
  15.       <xsl:call-template name="replace-string">
  16.         <xsl:with-param name="text" select="$after"/>
  17.         <xsl:with-param name="from" select="$from"/>
  18.         <xsl:with-param name="to" select="$to"/>
  19.       </xsl:call-template>
  20.     </xsl:when>
  21.     <xsl:otherwise>
  22.       <xsl:value-of select="$text"/>
  23.     </xsl:otherwise>
  24.   </xsl:choose>
  25.  
  26. </xsl:template>

Para utilizarla, hay que invocar el template de la siguiente manera:
Código xml:
Ver original
  1. <xsl:call-template name="replace-string">
  2.   <xsl:with-param name="text" select="path/del/nodo"/>
  3.   <xsl:with-param name="from" select="'textoAbuscar'"/>
  4.   <xsl:with-param name="to" select="'textoParaReemplazar'"/>
  5. </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
  1. <?xml version="1.0" ?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:output method="text"/>
  4.  
  5. <xsl:template match="seccion">
  6.     [TITLE]<xsl:value-of select="title"/>[/TITLE]
  7.     <xsl:variable name="def" select="para/def" />
  8.     <xsl:call-template name="replace-string">
  9.         <xsl:with-param name="text" select="normalize-space(para)"/>
  10.         <xsl:with-param name="from" select="$def"/>
  11.         <xsl:with-param name="to" select="concat('[DEF]',$def,'[/DEF]')"/>
  12.     </xsl:call-template>
  13. </xsl:template>
  14.  
  15. <!--
  16.    Template para reemplazar cadenas.
  17.    [url]http://www.nectil.com/Public/ManualText.php?ID=2586&manualID=2547[/url]
  18.    -->
  19. <xsl:template name="replace-string">
  20.     <xsl:param name="text"/>
  21.     <xsl:param name="from"/>
  22.     <xsl:param name="to"/>
  23.  
  24.     <xsl:choose>
  25.       <xsl:when test="contains($text, $from)">
  26.           <xsl:variable name="before" select="substring-before($text, $from)"/>
  27.           <xsl:variable name="after" select="substring-after($text, $from)"/>
  28.           <xsl:variable name="prefix" select="concat($before, $to)"/>
  29.  
  30.           <xsl:value-of select="$before"/>
  31.           <xsl:value-of select="$to"/>
  32.           <xsl:call-template name="replace-string">
  33.             <xsl:with-param name="text" select="$after"/>
  34.             <xsl:with-param name="from" select="$from"/>
  35.               <xsl:with-param name="to" select="$to"/>
  36.           </xsl:call-template>
  37.         </xsl:when>
  38.         <xsl:otherwise>
  39.           <xsl:value-of select="$text"/>
  40.         </xsl:otherwise>
  41.     </xsl:choose>
  42.  
  43. </xsl:template>
  44. </xsl:stylesheet>

Y así es que consigo el objetivo buscado... quedo tranquilo por ahora. Ojalá a alguien más le sirva, cualquier comentario bienvenido.

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"