Archivos de la categoría ‘XML / XSL’

Si queremos reemplazar el carácter de salto de linea por un tag html “BR” de un texto podemos emplear el siguiente template, el parser xsl reconocerá el salto de linea como ‘
’

    <xsl:template name="break">
        <xsl:param name="text"/>
        <xsl:choose>
            <xsl:when test="contains($text, '&#xA;')">
                <xsl:value-of select="substring-before($text, '&#xA;')"/>
                <br/>
                <xsl:call-template name="break">
                    <xsl:with-param name="text" select="substring-after($text, '&#xA;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Nota:

    '&#xA;'   nueva linea
    '&#x9;'   TAB
    '&#xD;'   retorno de carro

Si lo que necesitamos es un template buscar y reemplazar una cadena de texto por otra cadena de texto, podemos utilizar el siguiente:

    <xsl:template name="string-replace-all">
        <xsl:param name="text"/>
        <xsl:param name="replace"/>
        <xsl:param name="by"/>
        <xsl:choose>
            <xsl:when test="contains($text, $replace)">
                <xsl:value-of select="substring-before($text,$replace)"/>
                <xsl:value-of select="$by"/>
                <xsl:call-template name="string-replace-all">
                    <xsl:with-param name="text" select="substring-after($text,$replace)"/>
                    <xsl:with-param name="replace" select="$replace"/>
                    <xsl:with-param name="by" select="$by"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Por ejemplo, sea nuestro xml:

<?xml version="1.0"?>
<pagina>
    <texto>El primer parrafo.El segundo parrafo.El tercer parrafo.</texto>
</pagina>

Y para invocar el template podriamos citar el siguiente ejemplo para reemplazar la palabra “parrafo” por “guion”:

<xsl:call-template name="string-replace-all">
    <xsl:with-param name="text" select="pagina/texto"/>
    <xsl:with-param name="replace" select="'parrafo'"/>
    <xsl:with-param name="by" select="'guion'"/>
</xsl:call-template>

Si lo que necesitamos es un template buscar y reemplazar una cadena de texto por un elemento html (por ejemplo: BR, SPAN, etc.), podemos utilizar el siguiente:

    <xsl:template name="string-replace-all-by-element">
        <xsl:param name="text"/>
        <xsl:param name="replace"/>
        <xsl:param name="by"/>
        <xsl:choose>
            <xsl:when test="contains($text, $replace)">
                <xsl:value-of select="substring-before($text,$replace)"/>
                <xsl:copy-of select="$by"/>
                <xsl:call-template name="string-replace-all">
                    <xsl:with-param name="text" select="substring-after($text,$replace)"/>
                    <xsl:with-param name="replace" select="$replace"/>
                    <xsl:with-param name="by">
                        <xsl:copy-of select="$by"/>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Por ejemplo, sea nuestro xml:

<?xml version="1.0"?>
<pagina>
    <texto>El primer parrafo.-El segundo parrafo.-El tercer parrafo.--Final.</texto>
</pagina>

Y para invocar el template podriamos citar el siguiente ejemplo para reemplazar los guiones por elementos html “BR”:

<xsl:call-template name="string-replace-all-by-element">
    <xsl:with-param name="text" select="pagina/texto"/>
    <xsl:with-param name="replace" select="'-'"/>
    <xsl:with-param name="by">
        <xsl:element name="br"></xsl:element>
    </xsl:with-param>
</xsl:call-template>

Estos ejemplos son para la XPATH 1.0, pero para la XPATH 2.0 ya tiene la funcion nativa replace con la cual no necesitas del template, la forma de invocarla seria tan sencilla como esto:

    <xsl:value-of select="replace(pagina/texto,'parrafo','guion')"/>

Mas info:

XQuery 1.0 y XPath 2.0 operadores y funciones
http://www.w3.org/TR/xpath-functions/

Sintaxis XML canonico
http://www.w3.org/TR/2000/WD-xml-c14n-20000119.html

Mike Malone escribio en su blog personal http://immike.net/blog/ un interesante post (traducido al castellano) “5 expresiones regulares que todo programador web debería saber” de la que yo destaco:

Encontrar un tag XHTML/XML
Reemplazar “tag” por el literal del nombre de la etiqueta

Encontrar un tag XHTML/XML con un atributo especifico
Reemplazar “tag” por el literal del nombre de la etiqueta y “attribute” por el literal del nombre del atributo

Un caso especial seria las etiquetas que no las cierran (siguiendo los estandares si deberia tener su etiqueta de cierre), como las imagenes:

regexp_matching_tag_img

Hace poco tuve que realizar una tarea para reemplazar un determinado tag y me fue muy útil. Si quieres verlas todas y en castellano puedes verlas en sentido web

Si quieres un ejemplo de utilizar expresiones regulares en javascript, aqui un documento de Mozilla

Además si tienes instalado la extensión para Firefox “Find Bar” creado por Dave Townsend, te permite buscar con expresiones regulares desde la barra de búsqueda:

Un articulo publicado en microsoft por Andy González nos da unos ejemplos de expresiones regulares como estas:

Original:
http://immike.net/blog/2007/04/06/
5-regular-expressions-every-web-programmer-should-know/

Via:
http://sentidoweb.com/2007/07/23/
5-expresiones-regulares-utiles-para-desarrollo-web.php

Guia Javascript: Expresiones Regulares
http://developer.mozilla.org/es/docs/
Gu%C3%ADa_JavaScript_1.5:Expresiones_Regulares

Guía Javascript: Trabajar con expresiones regulares (Mozilla Developer Center):
http://developer.mozilla.org/es/docs/
Gu%C3%ADa_JavaScript_1.5:Trabajar_con_expresiones_regulares

Sitio oficial de Find Bar:
http://www.oxymoronical.com/web/firefox/FindBarRX

Find Bar en Mozilla Firefox Add-ons:
https://addons.mozilla.org/es-ES/firefox/addon/6534

Ejemplos de Andy González en microsoft:
http://www.microsoft.com/spanish/msdn/articulos/archivo/
201205/voices/regex.mspx

A veces tenemos la necesidad de comparar el valor del nodo actual con el valor del nodo anterior. Por ejemplo si tenemos un XML:

<?xml version="1.0" encoding="UTF-8"?>
<raiz>
    <nodo>
        <orden>1</orden>
        <valor>uno</valor>
    </nodo>
    <nodo>
        <orden>1</orden>
        <valor>uno</valor>
    </nodo>
    <nodo>
        <orden>2</orden>
        <valor>dos</valor>
    </nodo>
    <nodo>
        <orden>2</orden>
        <valor>dos</valor>
    </nodo>
    <nodo>
        <orden>3</orden>
        <valor>tres</valor>
    </nodo>
    <nodo>
        <orden>3</orden>
        <valor>tres</valor>
    </nodo>
    <nodo>
        <orden>3</orden>
        <valor>tres</valor>
    </nodo>
    <nodo>
        <orden>4</orden>
        <valor>cuatro</valor>
    </nodo>
    <nodo>
        <orden>4</orden>
        <valor>cuatro</valor>
    </nodo>
    <nodo>
        <orden>4</orden>
        <valor>cuatro</valor>
    </nodo>
    <nodo>
        <orden>4</orden>
        <valor>cuatro</valor>
    </nodo>
</raiz>

Tenemos nuestro XSLT que recuperara los valores diferentes del nodo hijo:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" media-type="text/html" encoding="UTF-8"/>
  <xsl:template match="raiz">
    <html>
      <head>
        <title>Comparar el valor del nodo actual con el valor del nodo anterior</title>
      </head>
      <body>
        <xsl:for-each select="nodo">
          <xsl:choose>
            <xsl:when test="position()=1">
              <p>
                <xsl:value-of select="valor"/>
              </p>
            </xsl:when>
            <xsl:otherwise>
              <xsl:if test="preceding-sibling::nodo[1]/orden!=orden">
                <p>
                  <xsl:value-of select="valor"/>
                </p>
              </xsl:if>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

EL preceding-sibling recupera todos los nodos que son anteriores al nodo actual, pero como nos interesa el anterior y adyacente por eso recuperamos el de la primera posición. Al transformar el XML con la hoja de estilo nos deberia retornar:

            <p>uno</p>
            <p>dos</p>
            <p>tres</p>
            <p>cuatro</p>

Referencia:
http://www.zvon.org/xxl/XSLTreference/Output/index.html

os recomiendo esta super referencia para todo lo de XSL y más:
http://www.zvon.org/xxl/XSLTreference/Output/index.html

Utilizando la función translate del xsl podemos transformar nuestro texto en mayusculas o minusculas segun sea el caso, para eso definiremos 2 xsl:variable, una con los literales en minúsculas y el otro con los literales en mayúsculas

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

Sea nuestro XML de ejemplo



Este es un ejemplo de EDUSANVER

para poner todo el texto a minusculas podriamos hacer:


el resultado sería:

este es un ejemplo de edusanver

para poner todo el texto a mayusculas podriamos hacer:


el resultado sería:

ESTE ES UN EJEMPLO DE EDUSANVER

Enlaces de referencia:
http://www.topxml.com/xsl/articles/caseconvert/
http://www.stylusstudio.com/xsllist/200303/post60480.html

os recomiendo esta super referencia para todo lo de XSL y más:
http://www.zvon.org/xxl/XSLTreference/Output/index.html

Hay un interesante articulo publicado por Mozilla Developer Center (MDC) acerca de las diferencias más conocidas y menos conocidas entre estos 2 navegadores, hay secciones sobre visualización de las páginas, CSS, javascript, manejo de eventos, XML, etc. Aunque yo recomiendo leer por completo el articulo por ser de interes de todo desarrollador web, copio un par de fragmentos:

Modo quirks

Actualmente, el web está plagado de sitios con HTML no válido, además de marcado que sólo funciona gracias a fallos de ciertos navegadores. Los antiguos navegadores de Netscape, cuando eran los amos del mercado, tenían fallos. Cuando desembarcó Internet Explorer, plagió esos mismos fallos para poder visualizar correctamente las páginas de aquella época. Más tarde cuando los nuevos navegadores llegaron al mercado, la mayoría de estos fallos originales, usualmente llamados quirks, fueron mantenidos por razones de compatibilidad hacia atrás. Mozilla soporta muchos de estos fallos cuando visualiza páginas en modo quirks. Nótese que debido a estos quirks, las páginas se visualizan más lentamente que si estuvieran escritas para respetar los estándares. La mayoría de las páginas web son visualizadas utilizando este modo. Mozilla utiliza este modo cuando encuentra las siguientes condiciones:

* Cuando no se ha especificado un doctype.
* Cuando se ha especificado un doctype sin su identificador de sistema (por ejemplo, <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”></code>)

Diferencias en las fechas de JavaScript

La única diferencia en el objeto Date es el método getYear. Para la especificación ECMAScript (que es la que sigue JavaScript), el método no es compatible con el efecto 2000 y al ejecutar new Date().getYear() en 2004 se obtendrá un valor igual a “104″. Para la especificación ECMAScript, getYear devuelve el año menos 1900 lo cual devolvía “98″ para 1998. getYear quedó obsoleto en la versión 3 de ECMAScript y fue reemplazado por getFullYear. Internet Explorer cambió la implementación de getYear para que funcionara como getFullYear y fuese así compatible con el efecto 2000, mientras que Mozilla mantuvo el comportamiento estándar.

Diferencias en XSLT

Si el XSLT necesita distinguir el navegador, se puede consultar la propiedad de sistema “xsl:vendor“. El motor XSLT de Mozilla devolverá “Transformiix” mientras que Internet Explorer devolverá “Microsoft”.




<!-- Marcado específico de Mozilla -->





<!-- Marcado específico de Internet Explorer -->

Por cierto yo recomiendo echarle un ojo a la web de Mozilla Developer Center que esta nutrida de información interesante e infaltable en tus favoritos.Artículo Completo:
http://developer.mozilla.org/es/docs/Migrar_aplicaciones_desde_Internet_Explorer_a_Mozilla

Mozilla Developer Center (en castellano):
http://developer.mozilla.org/es/docs/Portada

Mozilla Developer Center (en castellano), Categoría: Desarrollo Web:
http://developer.mozilla.org/es/docs/Categor%C3%ADa:Desarrollo_Web