Les données XML peuvent être converties en HTML à l'aide d'une simple feuille de style XSL. Alors que la spécification XML continue d'évoluer, il semble nécessaire de satisfaire les besoins de chacun dans les nouvelles versions. Malheureusement, effectuer de simples transformations a toujours été un problème pour la spécification.
Supposons que j'ai des données XML qui représentent le contenu d'une page et que je souhaite maintenant convertir son contenu en mise en page. Voici le XML que je souhaite convertir :
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="article.xsl"?>
<xml>
<dossiers>
<dossier>
<text>Dossier 1</text>
<fichiers>
<fichier>
<text>Fichier 1</text>
<champs>
<champ>
<données>
<type>chaîne</type>
<longueur>50</longueur>
<value>certaines données</value>
</données>
</champ>
</champs>
</fichier>
</fichiers>
</dossier>
</dossiers>
</xml>
Ce contenu représente un ensemble de dossiers, de fichiers et de champs. Chaque dossier contient des fichiers et chaque fichier contient des champs pour saisir des données. Chaque dossier du groupe de dossiers sera représenté par un élément TR et un élément TD dans la première ligne d'un TABLE. Chaque fichier du groupe de fichiers sera représenté comme un élément TR et un élément TD sur la première ligne d'un élément TABLE imbriqué dans l'élément TR du dossier. Chaque domaine du groupe de domaines apparaîtra comme une INPUT dans le fichier associé.
Pour mettre en œuvre cette idée, nous devons parcourir le XML et créer une table basée sur le XSL.
Voici le XSL utilisé pour cette transformation :
<?xml version="1.0"?>
<xsl:feuille de style
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform " version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:fn=" http://www.mycompany.com/mynamespace ">
<xsl:output method="html"/>
<msxsl:script language="JScript" Implements-prefix="fn">
function getElementCount (liste de nœuds, quoi) {
varrtrn = 0;
rtrn = nodelist[0].parentNode.selectNodes(what).length;
return (rtrn + 1); //1 est ajouté pour le remplissage TD
}
</msxsl:script>
<xsl:template match="/">
<TABLE CELLSPACING="0" CELLPADDING="0"
LARGEUR="100%" BORDER="0" ID="tblRoot" NAME="tblRoot"
style="table-layout:fixed;">
<TR>
<xsl:for-each select="xml/folders/folder">
<xsl:element name="TD">
<xsl:attribute name="style">largeur:55px</xsl:attribute>
<xsl:value-of select="text"/>
</xsl:élément>
</xsl:pour-chacun>
<TD> </TD>
</TR>
<xsl:for-each select="xml/folders/folder">
<TR>
<xsl:element name="TD">
<xsl:attribute name="colspan">
<xsl:value-of select="fn:getElementCount(., 'folder')"/>
</xsl:attribut>
<TABLE CELLSPACING="0" CELLPADDING="0"
WIDTH="100%" BORDER="0" style="table-layout:fixed;">
<TR>
<xsl:for-each select="files/file">
<xsl:element name="TD">
<xsl:attribute name="style">largeur:55px;</xsl:attribute>
<xsl:value-of select="text"/>
</xsl:élément>
</xsl:pour-chacun>
<TD> </TD>
</TR>
<xsl:for-each select="files/file">
<TR>
<xsl:element name="TD">
<xsl:attribute name="colspan">
<xsl:value-of select="fn:getElementCount(., 'file')"/>
</xsl:attribute>
<xsl:for-each select="fields/field">
<xsl:element name="INPUT">
<xsl:attribute name="type">texte</xsl:attribute>
<xsl:nom de l'attribut="maxlength">
<xsl:value-of select="data/length"/>
</xsl:attribut>
<xsl:nom de l'attribut="valeur">
<xsl:value-of select="data/value"/>
</xsl:attribut>
</xsl:élément><BR/>
</xsl:for-each>
</xsl:element>
</TR>
</xsl:pour-chacun>
</TABLE>
</xsl:élément>
</TR>
</xsl:pour-chacun>
</TABLE>
</xsl:template>
</xsl:feuille de style>
Dans la balise stylesheet, nous avons configuré plusieurs espaces de noms, y compris l'espace de noms xsl qui définit toutes les balises de transformation xsl. Espace de noms msxml qui nous permet de créer des fonctions utilisateur pouvant être utilisées dans des feuilles de style. J'utilise ceci pour obtenir tous les éléments enfants afin d'obtenir un attribut COLSPAN défini pour une balise TD. L'espace de noms fn utilisé pour rejoindre un ensemble de fonctions définies par l'utilisateur créées par l'élément msxml:script.
Ensuite, nous créons la TABLE externe et le premier TR. Dans le TR, je crée un TD pour chaque dossier spécifié dans le XML. J'ai utilisé la balise xsl:element car elle me permet d'ajouter des attributs personnalisés ou d'exécuter une fonction pour définir une propriété pour l'attribut COLSPAN dans un autre élément TD.
Après avoir créé le TD requis pour chaque dossier, j'ai commencé à créer le TR pour chaque dossier. J'ajoute seulement un TD à ce TR, mais je définis son attribut COLSPAN égal au nombre de balises de dossier dans le groupe de dossiers plus une. L'extra est utilisé pour remplir les espaces dans une TABLE à disposition fixe.
Pour obtenir COLSPAN, je passe le contexte courant (précisé ici par ".") et le nom du nœud que je veux calculer. Dans ma fonction, j'obtiens le contexte actuel, paraentNode et le nombre de nœuds spécifiés dans la requête XPath. La fonction renvoie ensuite ce montant plus un pour remplir le TD.
Avec ce TD, j'y intègre une autre TABLE qui contient chaque fichier du groupe de fichiers. A partir de ce moment, le processus est le même que pour une conversion TABLE externe. La dernière étape consiste à ajouter les champs dans chaque fichier. Cette fois, je n'ai pas créé de TABLE intégrée, j'ai simplement ajouté les champs au TD actuel.
Une fois que j'ai terminé la présentation générale, je peux commencer à ajouter des fonctionnalités de l'interface utilisateur, telles que masquer d'autres dossiers et lignes de fichiers jusqu'à ce que l'utilisateur clique sur l'onglet correspondant. Cette fonctionnalité peut être obtenue en écrivant un script qui prend en charge cette fonctionnalité, en ajoutant un élément onclick xsl:attribute aux éléments TD de dossier et de fichier, puis en définissant sa valeur sur le nom de la fonction de script.
Enfin, une fois la fonctionnalité commune terminée, vous pouvez ajouter la classe xsl:attributes et ajouter les noms de classe pertinents dans STYLE ou CSS pour obtenir l'apparence souhaitée.
Cet exemple crée une base pour la vue Fichier-Dossier-Champ utilisée dans le déploiement de solutions de données Web. Visitez MSDN pour en savoir plus sur la spécification XML de Microsoft.