XSL pour visualiser arbre XML sous forme de tableau en HTML
Salut !
Je cherche à créer une feuille de style XSL qui affiche (en HTML) n'importe quel document XML sous forme d'un arbre "visuel" (en utilisant des tableaux HTML par ex).
Un exemple...
A partir du XML suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style4.xsl"?>
<parents>
<enfant1>
<petitenfant11/>
<petitenfant12/>
</enfant1>
<enfant2/>
<enfant3>
<petitenfant31/>
</enfant3>
</parents> |
on obtiendrait dans le navigateur qqchose comme ça :
http://matthieu.ricaud.free.fr/arbreHTML.jpg
Voici le code xsl que j'au fait :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="*">
<table width="100%" align="center" border="1">
<tr bgcolor="coral">
<td align="center">
<xsl:attribute name="colspan"><xsl:value-of select="count(child::*)"/></xsl:attribute>
<xsl:value-of select="name()"/>
</td>
</tr>
<tr bgcolor="#9CCDA9">
<xsl:for-each select="child::*">
<td align="center" valign="top">
<table width="100%" align="center" border="1">
<tr bgcolor="coral">
<td align="center">
<xsl:attribute name="colspan"><xsl:value-of select="count(child::*)"/></xsl:attribute>
<xsl:value-of select="name()"/><xsl:apply-templates/></td>
</tr>
<tr></tr>
</table>
</td>
</xsl:for-each>
</tr>
</table>
</xsl:template>
</xsl:stylesheet> |
mais ca ne marche pas térrible...
Il s'agit quelque part de refaire le feuille de style par défaut de IE.
Si quelqu'un a déjà fait ça ou aurait des idées?
Grand merci d'avance !
matt
"visualiseur" de structure XML
Voici la première étape :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="Windows-1252"/>
<xsl:template match="/*">
<html>
<style type="text/css">
.FERME {background-color:#BBBBCC; font-family: Verdana; font-size: 8pt; cursor:pointer;}
.OUVERT { background-color:#EEF3FB; font-style:blod;font-family: Verdana; font-size: 8pt; cursor:pointer;}
.DERNIER { font-style:blod;font-family: Verdana; font-size: 8pt;}
.VALEURNOEUD { background-color:#FFFFCC; font-family: Verdana; font-size: 8pt;}
.ATTRIBUT {color:#999999;}
</style>
<script language="javascript">
function affiche_cache(objet){
ObjetCible=objet.parentNode.nextSibling;
if (ObjetCible.style.display=="none"){
ObjetCible.style.display="block";
objet.className="OUVERT";
}
else{
ObjetCible.style.display="none";
objet.className="FERME";
}
}
</script>
<body>
<table width="100%" align="center" border="1">
<tr>
<td width="100%" align="center" class="OUVERT" onclick="javascript:affiche_cache(this);">
<xsl:attribute name="colspan"><xsl:value-of select="count(child::*)"/></xsl:attribute>
<b><xsl:value-of select="name()"/></b>
(<span class="ATTRIBUT"><xsl:for-each select="@*"><b><xsl:value-of select="name()"/></b> : <i><xsl:value-of select="."/></i> </xsl:for-each></span>)
</td>
</tr>
<tr>
<xsl:apply-templates select="*"/>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="*">
<td valign="top" bgcolor="white">
<xsl:choose>
<xsl:when test="*">
<table width="100%" align="center" border="1">
<tr>
<td width="100%" align="center" class="FERME" onclick="javascript:affiche_cache(this);">
<xsl:attribute name="colspan"><xsl:value-of select="count(child::*)"/></xsl:attribute>
<b> <xsl:value-of select="name()"/></b>
(<span class="ATTRIBUT"><xsl:for-each select="@*"><b><xsl:value-of select="name()"/></b> : <i><xsl:value-of select="."/></i> </xsl:for-each></span>)
</td>
</tr>
<tr style="display:none">
<xsl:apply-templates select="*"/>
</tr>
</table>
</xsl:when>
<xsl:otherwise>
<div class="DERNIER">
<b><xsl:value-of select="name()"/></b>
(<span class="ATTRIBUT"><xsl:for-each select="@*"><b><xsl:value-of select="name()"/></b> : <i><xsl:value-of select="."/></i> </xsl:for-each></span>)
</div>
<div class="VALEURNOEUD"><xsl:value-of select="."/></div>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:template>
</xsl:stylesheet> |
A tester sur n'importe quel document XML.
J'aurais aimer qu'il n'y ait pas de "mémoire" de ce qui est déplier/replier : c'est-à-dire que si je déplis tous les noeuds et qu'ensuite je referme le noeud racine (par ex), alors lorsque je déplierai à nouveau le noeud racine, ses enfants ne seront pas dépliés...
c'est un peu la galère à coder !
dans la fonction affiche_cache je voulais ajouter dans le "else"un truc du genre :
Code:
1 2 3
|
objetCible.children[1].style.display="none"
(ou childNode pour Netscape) |
mais ça marche pas du tout :(
Sinon, j'aimerai tout simplement un bouton qui déplit tout l'arbre d'un coup, mais c'est pareil j'ai essayer un code qui ne marche pas non plus... :cry:
Peut-être que ma fonction affiche_cache n'est pas des plus judicieuse (je devrait plus utiliser XSL et les capacités de XPath)
Bref, appel aux bonnes âmes !
Je vais essayer de me pencher sur le problème d'édition du XML directement dans cet affichage...
Je vous tiens au courant :)