[XSLT] Croiser les données de 2 fichiers xml à l'aide d'une variable
Bonjour,
j'ai un fichier preferences.xml (parsé côté client par la feuille de style preferences.xsl), dans celui-ci j'ai entre-autres, un noeud "menu[@name='User']" où figurent une liste de nom de sites choisis par l'utilisateur:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="preferences.xsl" type="text/xsl"?>
<preferences>
<menu name="User">
<item>Deezer</item>
<item>LastFM</item>
<item>Seeqpod</item>
</menu>
<menu name="Autres">
<item>ex1</item>
<item>ex2</item>
<item>ex3</item>
</menu>
</preferences> |
Tous les choix possibles sont stockés dans un fichier annexe Sites.xml:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| <?xml version="1.0" encoding="UTF-8"?>
<list>
<site>Deezer</site>
<site>Imeen</site>
<site>LastFM</site>
<site>MOG</site>
<site>Music IP</site>
<site>Pandora</site>
<site>Radioblogclub</site>
<site>Seeqpod</site>
<site>SocialFM</site>
</list> |
La sélection se fait par l'intermediaire de case à cocher: (prerences.xsl)
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
| <?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" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Sites</title>
</head>
<body>
<xsl:for-each select="document('Sites.xml')/list/site">
<xsl:element name="input">
<xsl:attribute name="type">checkbox</xsl:attribute>
<xsl:call-template name="checksite" />
</xsl:element>
<xsl:value-of select="." />
<xsl:element name="br" />
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template name="checksite">
<xsl:variable name="site" select="." />
<xsl:variable name="checking" select="false" />
<xsl:for-each select="//preferences/menu[@name='User']/item">
<xsl:if test=".=$site">
<xsl:variable name="checking" select="true" />
</xsl:if>
</xsl:for-each>
<xsl:choose>
<xsl:when test="$checking='true'">
<xsl:attribute name="checked">checked</xsl:attribute>
<xsl:attribute name="title">Available - click to set Unavailable</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="title">Unavailable - click to set Available</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet> |
le template 'checksite' sert à déterminer les choix par défaut à afficher en pré-cochant la case... aucune case ne sort cochée... savez-vous pourquoi?
Merci
J'ai trouvé une solution qui marche sous Safari mais pas sous FF
Dans le template "checksite" il fallait faire le test if "au sein" du noeud variable, puisqu'il détermine la valeur de la variable, sinon il y a deux déclaration pour la même variable ce que le processeur ne peut accepter.
Ensuite, pour pouvoir "revenir" au document courant (preferences.xml) à qui est appliqué la feuille de style, dans le for-each il faut commencer le chemin par document('') qui désigne la racine du document en cours:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <xsl:template name="checksite">
<xsl:variable name="site" select="." />
<xsl:variable name="checking">
<xsl:for-each select="document('')/preferences/menu[@name='User']/item">
<xsl:if test="contains(@name,$site)">
<xsl:value-of select="'true'" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:choose>
<xsl:when test="$checking='true'">
<xsl:attribute name="checked">checked</xsl:attribute>
<xsl:attribute name="title">Available - click to set Unavailable</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="title">Unavailable - click to set Available</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template> |
note: j'ai changé le preferences.xml:
Code:
1 2 3
| <item>NomSite</item>
en:
<item name="NomSite" /> |
Mais c'est un détail.
Pourquoi ça ne marche pas sous Firefox (aucune case cochée)?
Quelqu'un a-t-il la solution?
Merci