![]() |
Procesar etiqueta dentro de texto - XML -> XSL [Solucionado] Buenas. Tengo una cuestión simple pero me doy cuenta que antes no la había intentado. Se trata de que tengo texto dentro de una etiqueta, y dentro de ese texto puede haber otras etiquetas (como los <strong>, <em>, <span> de HTML). Necesito cachar ese texto y tratarlo para igual encerrarlo dentro de otras etiquetas, esta vez tipo BBCode. He aquí un XML de ejemplo:
Código xml:
Ver original Aquí el XSL que estoy --hasta ahora-- aplicando:
Código xml:
Ver original MI salida actual: Cita:
Cita:
Si alguien me hecha una pista, os agradeceré :-). :adios: |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Una pregunta, porque guardas en el XML <def> si luego debes mostrarlo como [def]...Podrías guardarlo directamente como [def] y mostrar literalmente lo que tiene la etiqueta... Lo que dices de encontrar los para/def y dejarlos en el mismo lugar NO SE PUEDE hace meses que tuve ese problema y me rompí la cabeza buscando la solución...no la encontré :'( Te sirve lo que te puse al principio ? un abrazo grande... :adios: |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Cita:
Se me hace difícil de creer no se pueda. La verdad es que no he visto nada así en los ejemplos de XSL. Intentaré buscarle, sino creo poderlo solucionar echando mano de PHP... a ver qué logro. :adios: |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Uf, uf, uf y recontra uf! :neurotico: 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 Para utilizarla, hay que invocar el template de la siguiente manera:
Código xml:
Ver original 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 Y así es que consigo el objetivo buscado... quedo tranquilo por ahora. Ojalá a alguien más le sirva, cualquier comentario bienvenido. :adios: |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Primero: se me pasó comentar que para XSL versión 2 hay una función replace() con la que no se tendría que recurrir a este template, por desgracia no pude hacer uso de esto. Segundo: Justo ahora que lo envié :-), descubro hay un pequeño problema. Suponiendo tengo el siguiente XML:
Código xml:
Ver original cuando aplique mi plantilla obtendría el siguiente resultado (negritas donde ocurre el reemplazo): Cita:
Cita:
Abúr! :adios: |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Saludos, Jam. Yo te iba a proponer que usaras un DTD en el cual crearas un par de ENTITY para obtener directamente las tags [def] y [/def], pero leo que tú no tienes acceso al archivo xml. El ejemplo que hice es el siguiente (nombré los archivos como "p1.xml" y "p1.xsl", para hacer pruebas). El XML: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet type="text/xsl" href="p1.xsl"?> <!DOCTYPE seccion[ <!ELEMENT seccion (title, para)> <!ELEMENT title (#PCDATA)> <!ELEMENT para (#PCDATA)> <!ENTITY XdefX "[def]"> <!ENTITY XxdefX "[/def]"> ]> <seccion> <title>Titulo</title> <para>Lorem &XdefX; ipsum &XxdefX; postea complectitur eos in, mandamus disputationi mediocritatem vix ei.</para> </seccion> El XSL: <?xml version="1.0" encoding="iso-8859-1" ?> <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:value-of select="para" /> </xsl:template> </xsl:stylesheet> El resultado: [TITLE]Titulo[/TITLE] Lorem [def] ipsum [/def] postea complectitur eos in, mandamus disputationi mediocritatem vix ei. Como verás, con el DTD se hubieran creado directamente las tags para bbcode, pero si no puedes acceder al xml mi ayuda está de más. Espero halles solución. Buen día. =0) |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Gracias por la sugerencia Ek-Balam, entiendo lo que dices, pero no tengo acceso al XML... al menos no de primera mano. Son recursos que se extraen externamente, de vez en cuando han de hacer cambios externos, fuera de mi control, tengo que agarrarlos y transformarlos para trabajar con el resultado. Pero bueno, ahora intenté esto:
Código xml:
Trato directamente el nodo <def> sin tratar el <para> y funciona, pero ahora tengo problema con los espacios, pues la tabulación y el fin de línea se conservan y es algo que no debería. Este es (mas o menos) mi salida:Ver original Código: |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Saludos de nuevo, Jam. Estaba viendo en tu archivo .xsl un detallito. Quizá sea lo que te pueda servir: Elimina el "<xsl:output method="text" />" y el "<xsl:for-each select="./*">........</xsl:for-each>". Y dentro del .xsl agrega una tabla. El ejemplo sería así: <?xml version="1.0" encoding="iso-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table><tr><td> <xsl:apply-templates /> </td></tr></table> </xsl:template> <xsl:template match="title"> <xsl:text>[TITLE]</xsl:text> <xsl:value-of select="." /> <xsl:text>[/TITLE]</xsl:text> </xsl:template> <xsl:template match="def"> <xsl:text>[DEF]</xsl:text> <xsl:value-of select="." /> <xsl:text>[/DEF]</xsl:text> </xsl:template> </xsl:stylesheet> Probé tu código inicial con el IE7, FF y Ópera, y únicamente en el IE7 colocaba el texto de corrido; mientras que en los otros 2, dejaba el salto de línea. Ahora, yo he probado la modificación al xsl y en los 3 navegadores deja el texto en una única línea. Espero que esto sea lo que necesitas. Buen día. =0) |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Hola, Posiblemente funcione así:
Código xml:
Ver original Saludos, |
Respuesta: Procesar etiqueta dentro de texto - XML -> XSL Ek-Balam: Perdón por no mencionarlo, creí estaba implícito: La salida tendría que ser texto plano, no HTML. De lo que menciones, veo son cambios para tratarlo como HTML y verlo a través de un navegador, perdona las molestias. HackmanC: ¡Gracias!. ¡Tan simple! :-P. La manera de acceder a el texto del nodo es lo que necesitaba; ese 'match="para/text()"' ahí y aplico el normalize-space(.) al contenido. Gracias, diste en el clavo :-). Entonces, paso el XSL final (ahora sí) con los siguientes cambios: - Agrego <xsl:strip-space elements="*"/>. Esto elimina los espacios sobrantes de todos los elementos, osea, la tabulación y saltos de línea entre nodos. Estoy trabajando con texto plano ;-), es necesario esto. - Agrego el template para eliminar los saltos de línea (limitado a 80 caracteres) del nodo <para>, gracias al código de HackmanC. - Agrego un salto de línea después de [/TITLE]. Nuevamente, al estar trabajando con texto plano, los saltos de línea son igual caracteres implicitos.
Código xml:
Ver original Y voalá! :-). Muchas gracias a todos, creo ahora sí está solucionado, ojalá le sirva a alguien más. :adios: |
| La zona horaria es GMT -6. Ahora son las 10:56. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.