2012-06-07 17 views
7

tengo XML como esto:Transformación de XML en HTML: ¿práctica recomendada?

<Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/> 

¿Qué necesito para usar en el formato HTML:

<a href="#" data-name="Syd Mead" data-id="3412" 
    data-ntrack="28" data-pop="8" 
    class="pop-8"><span>Syd Mead</span></a> 

¿Cuál es la manera "correcta" de hacer esto para la más amplia gama de navegadores? ¿Se puede hacer esto de manera confiable con una transformación XSLT? ¿Es mejor usar una expresión regular (improbable) o tengo que analizar el xml y para cada etiqueta <Artist> leer cada atributo y hacer document.createElement y setAttribute manualmente?

Las etiquetas <Artist> están en un nodo padre, hay muchas de ellas. ¿Hay una mejor práctica para esto?

+0

Sí, esto se puede hacer de una manera muy compacta y elegante mediante XSLT. –

Respuesta

5

Parece un candidato perfecto para XSLT: el XML es limpio & bien formado. Si le preocupa la compatibilidad del navegador, ¿por qué no hacer la transformación en el servidor?

Este XSLT va a transformar sus datos - puede probarlo here: datos

Fuente:

<Artists> 
    <Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/> 
</Artists> 

XSLT:

<?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="/"> 
    <xsl:for-each select="Artists/Artist"> 
     <a href="#"> 
      <xsl:attribute name="data-id">  
       <xsl:value-of select="@id"/> 
      </xsl:attribute> 
      <xsl:attribute name="data-ntrack">  
       <xsl:value-of select="@ntrack"/> 
      </xsl:attribute> 
      <xsl:attribute name="data-pop">  
       <xsl:value-of select="@pop"/> 
      </xsl:attribute> 
      <xsl:attribute name="data-name">  
       <xsl:value-of select="@name"/> 
      </xsl:attribute> 
      <xsl:attribute name="class">  
       <xsl:value-of select="concat('pop-',@pop)"/> 
      </xsl:attribute> 

      <span><xsl:value-of select="@name"/></span> 
     </a> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

no he hecho esto en el lado del cliente Desafortunadamente, no puedo hablar por la compatibilidad del navegador.

+0

Server-side no es una opción. Entonces, ¿cómo se vería el XSLT para transformar?Y es la sintaxis XSLT tal que el mismo código funcionaría para los principales navegadores (IE7 +, Chrome, Firefox, Safari). – artlung

+0

@artlung - actualizado con xslt apropiado. –

+0

@SimonMcKenzie - No olvide el atributo 'clase'. –

2

Aquí es otra opción de hoja de estilo XSLT que es más simple en mi opinión:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 

    <xsl:template match="/*/Artist"> 
     <a href="#" class="pop-{@pop}"> 
      <xsl:apply-templates select="@*"/> 
      <span><xsl:value-of select="@name"/></span> 
     </a>   
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:attribute name="data-{name()}"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

de entrada XML

<Artists> 
    <Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/> 
</Artists> 

salida HTML

<a class="pop-8" href="#" data-name="Syd Mead" data-id="3412" data-ntrack="28" data-pop="8"> 
    <span>Syd Mead</span> 
</a> 
5

Aquí es un simple (no condicionales, no hay plantillas adicionales, sin xsl:attribute, sin xsl:for-each), la transformación corta y completa:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="no"/> 

<xsl:template match="Artist"> 
    <a href="#" data-name="{@name}" 
       data-id="{@id}" 
       data-ntrack="{@ntrack}" 
       data-pop="{@pop}" 
       class="pop-{@pop}"> 
    <span><xsl:value-of select="@name"/></span> 
    </a> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en el documento XML proporcionado:

<Artist name="Syd Mead" id="3412" ntrack="28" pop="8"/> 

el resultado deseado, adecuados, se produce:

<a href="#" data-name="Syd Mead" data-id="3412" data-ntrack="28" data-pop="8" class="pop-8"><span>Syd Mead</span></a> 

Explicación: El uso adecuado de AVT (atributo Valor plantillas)

+0

Esto me parece una solución mucho más viable en este caso , especialmente debido a su sintaxis escueta que se parece mucho a las plantillas en los marcos web modernos. –

+1

@LayZee, Sí, estoy completamente de acuerdo :). De nada. –

Cuestiones relacionadas