Los datos XML se pueden convertir a HTML utilizando una simple hoja de estilo XSL. A medida que la especificación XML continúa evolucionando, parece necesario satisfacer las necesidades de todos en nuevas versiones; desafortunadamente, realizar transformaciones simples siempre ha sido un problema para la especificación;
Supongamos que tengo datos XML que representan el contenido de una página y ahora quiero convertir su contenido en un diseño. Aquí está el XML que quiero convertir:
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="article.xsl"?>
<xml>
<carpetas>
<carpeta>
<texto>Carpeta 1</texto>
<archivos>
<archivo>
<text>Archivo 1</text>
<campos>
<campo>
<datos>
<tipo>cadena</tipo>
<longitud>50</longitud>
<valor>algunos datos</valor>
</datos>
</campo>
</campos>
</archivo>
</archivos>
</carpeta>
</carpetas>
</xml>
Este contenido representa un conjunto de carpetas, archivos y campos. Cada carpeta contiene archivos y cada archivo contiene campos para ingresar datos. Cada carpeta del grupo de carpetas estará representada por un elemento TR y un elemento TD en la primera fila de una TABLA. Cada archivo del grupo de archivos se representará como un elemento TR y un elemento TD en la primera línea de un elemento TABLE anidado dentro de la carpeta del elemento TR. Cada dominio del grupo de dominios aparecerá como una ENTRADA en el archivo asociado.
Para implementar esta idea, necesitamos recorrer XML y crear una tabla basada en XSL.
Aquí está el XSL utilizado para esta transformación:
<?xml version="1.0"?>
<xsl:hoja de estilo
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform " versión="1.0"
xmlns:msxsl="urna:esquemas-microsoft-com:xslt"
xmlns:fn=" http://www.miempresa.com/miespaciodenombres ">
<xsl:método de salida="html"/>
<msxsl:lenguaje de script="JScript" implements-prefix="fn">
función getElementCount(lista de nodos, qué) {
vartrn = 0;
rtrn = lista de nodos[0].parentNode.selectNodes(qué).length;
return (rtrn + 1); //se agrega 1 para el relleno TD
}
</msxsl:script>
<xsl:template match="/">
<TABLE CELLSPACING="0" CELLPADDING="0"
ANCHO="100%" BORDE="0" ID="tblRoot" NOMBRE="tblRoot"
estilo="diseño-tabla:fijo;">
<TR>
<xsl:para-cada seleccionar="xml/carpetas/carpeta">
<xsl:nombre del elemento="TD">
<xsl:nombre del atributo="estilo">ancho:55px</xsl:atributo>
<xsl:valor-de seleccionar="texto"/>
</xsl:elemento>
</xsl:para-cada>
<TD> </TD>
</TR>
<xsl:for-each select="xml/carpetas/carpeta">
<TR>
<xsl:nombre del elemento="TD">
<xsl:nombre del atributo="colspan">
<xsl:valor-de seleccionar="fn:getElementCount(., 'carpeta')"/>
</xsl:atributo>
<TABLE CELLSPACING="0" CELLPADDING="0"
WIDTH="100%" BORDER="0" estilo="table-layout:fixed;">
<TR>
<xsl:para-cada seleccionar="archivos/archivo">
<xsl:nombre del elemento="TD">
<xsl:nombre del atributo="estilo">ancho:55px;</xsl:atributo>
<xsl:valor-de seleccionar="texto"/>
</xsl:elemento>
</xsl:para-cada>
<TD> </TD>
</TR>
<xsl:for-each select="archivos/archivo">
<TR>
<xsl:nombre del elemento="TD">
<xsl:nombre del atributo="colspan">
<xsl:valor-de seleccionar="fn:getElementCount(., 'archivo')"/>
</xsl:atributo>
<xsl:para-cada seleccionar="campos/campo">
<xsl:nombre del elemento="ENTRADA">
<xsl:nombre del atributo="tipo">texto</xsl:atributo>
<xsl:nombre del atributo="longitud máxima">
<xsl:valor-de selección="datos/longitud"/>
</xsl:atributo>
<xsl:nombre del atributo="valor">
<xsl:valor-de seleccionar="datos/valor"/>
</xsl:atributo>
</xsl:elemento><BR/>
</xsl:para-cada>
</xsl:elemento>
</TR>
</xsl:para-cada>
</TABLA>
</xsl:elemento>
</TR>
</xsl:para-cada>
</TABLE>
</xsl:plantilla>
</xsl:hoja de estilo>
En la etiqueta de la hoja de estilo, configuramos varios espacios de nombres, incluido el espacio de nombres xsl que define todas las etiquetas de transformación xsl. Espacio de nombres msxml que nos permite crear funciones de usuario que se pueden utilizar en hojas de estilo. Utilizo esto para obtener todos los elementos secundarios con el fin de obtener un atributo COLSPAN establecido para una etiqueta TD. El espacio de nombres fn utilizado para unir un conjunto de funciones definidas por el usuario creadas por el elemento msxml:script.
Luego, creamos la TABLA exterior y el primer TR. En TR, creo un TD para cada carpeta especificada en el XML. Utilicé la etiqueta xsl:element porque me permite agregar atributos personalizados o realizar una función para establecer una propiedad para el atributo COLSPAN en otro elemento TD.
Después de crear el TD requerido para cada carpeta, comencé a crear el TR para cada carpeta. Solo agrego un TD a este TR, pero configuro su atributo COLSPAN igual al número de etiquetas de carpeta en el grupo de carpetas más uno. El extra se usa para llenar espacios en una TABLA de diseño fijo.
Para obtener COLSPAN, paso el contexto actual (especificado aquí por ".") y el nombre del nodo que quiero calcular. En mi función, obtengo el contexto actual, paraentNode y la cantidad de nodos especificados en la consulta XPath. Luego, la función devuelve esta cantidad más uno para completar el TD.
Con este TD, incrusto otra TABLA que contiene cada archivo del grupo de archivos. A partir de este momento, el proceso es el mismo que para una conversión TABLE externa. El último paso es agregar los campos en cada archivo. Esta vez no creé una TABLA incrustada, simplemente agregué los campos al TD actual.
Una vez que haya completado el diseño general, puedo comenzar a agregar funciones de interfaz de usuario, como ocultar otras carpetas y filas de archivos hasta que el usuario haga clic en la pestaña correspondiente. Esta funcionalidad se puede lograr escribiendo un script que admita esta funcionalidad, agregando un elemento onclick xsl:attribute a los elementos TD de carpeta y archivo y luego estableciendo su valor en el nombre de la función del script.
Finalmente, una vez completada la funcionalidad común, puede agregar atributos de clase xsl: y agregar los nombres de clase relevantes en ESTILO o CSS para obtener el aspecto que desea.
Este ejemplo crea una base para la vista Archivo-Carpeta-Campo utilizada en la implementación de soluciones de datos web. Visite MSDN para obtener más información sobre la especificación XML de Microsoft.