Contribuez à la FAQ et aux CODES SOURCE XML
La FAQ XML est disponible ici:
http://xml.developpez.com/faq/
Afin de continuer à la faire évoluer mais aussi afin de pouvoir publier de nouveaux CODES SOURCES nous avons toujours besoin de votre aide.
Vos contributions doivent être rédigées clairement dans un français correct. Les réponses peuvent inclure du code, des images, des fichiers joints, des liens internes ou externes à Développez.com et des références à d'autre questions/réponses de la FAQ ou des CODES SOURCES.
Merci pour votre participation à la vie du forum XML !
passage de paramètres- transformation serveur
Q: comment passer des paramètres à une feuille XSLT?
R: La solution consiste à utiliser un processeur Xslt auquel on passe les paramètres souhaités.
Côté serveur
il suffit d'écrire un script qui récupère les paramètres de la requête http, invoque le processeur xslt avec ces paramètres puis écrit le résultat dans la réponse http.
-PHP : Sablotron
-JAVA : JAXP (Java), Xalan (Apache)
-C++ : Xalan C++ (Apache)
-ASP/DotNet : composants MsXML ou XMLDOM
Coté Client :
Malheureusement la balise xml-stylesheet ne permet pas de passer deq paramètres à une feuille de style...
Une astuce permet cependant de modifier les éléments de la feuille xslt avant la transformation en accédant au document xsl lié (avec l'api Dom de javascript), mais cette solution n'est pas vraiment pas recommandée.
Une solution consiste à écrire un code javascript qui va :
-charger les document xml et la feuille de style
-créer un processeur Xslt en lui fournissant la feuille de style
-passer les paramètres éventuels de la feuille de style
-écrire le résultat dans un élément de la page.
IE et Mozilla/Firefox n'ont pas la même API de transformation XSLT.
Exemple de page effectuant un tri dynamique sur des données XML.
test.html : page html effectuant la transfo
Pour IE :
Attention il vous faudra la librairie MsXML 4.0
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
| <html>
<head>
<script type="text/javascript">
function tri(field,order) {
var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
var xslProc;
xslDoc.async = false;
xslDoc.load("test-xslt.xml");
xslt.stylesheet = xslDoc;
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
xmlDoc.async = false;
xmlDoc.load("test.xml");
xslProc = xslt.createProcessor();
xslProc.input = xmlDoc;
xslProc.addParameter("field", field);
xslProc.addParameter("order", order);
xslProc.transform();
document.body.innerHTML=xslProc.output;
}
</script>
</head>
<body>
<script type="text/javascript">
tri('name', 'ascending');
</script>
</body>
</html> |
Pour Mozilla/Firefox:
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
|
<html>
<head>
<script type="text/javascript">
var processor;
var xslt;
var xmlDoc;
function tri(field,order) {
processor.setParameter(null,"field", field);
processor.setParameter(null,"order", order);
var resultat = processor.transformToFragment(xmlDoc,document);
document.body.innerHTML = ""
document.body.appendChild(resultat);
}
function tri_init(field,order) {
xslt= document.implementation.createDocument("", "", null);
xslt.async=false;
xslt.load("test-xslt.xml");
processor =new XSLTProcessor();
processor.importStylesheet(xslt);
xmlDoc= document.implementation.createDocument("", "", null);
xmlDoc.async=false;
xmlDoc.load("test.xml");
tri(field,order);
}
</script>
</head>
<body>
<script type="text/javascript">
tri_init('name', 'ascending');
</script>
</body>
</html> |
test-xslt.xml
feuille xslt des règles de transfo
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?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" indent="yes"/>
<xsl:param name="field"/>
<xsl:param name="order"/>
<xsl:template match="persons">
<table>
<xsl:variable name="neworder">
<xsl:if test="$order='ascending'">descending</xsl:if>
<xsl:if test="$order='descending'">ascending</xsl:if>
</xsl:variable>
<tr><th><a href="javascript:tri('name','{$neworder}')">name</a></th><th><a href="javascript:tri('phone','{$neworder}')">phone number</a></th></tr>
<xsl:for-each select="person">
<xsl:sort select="*[name()=$field]" order="{$order}"/>
<tr><td><xsl:value-of select="name"/></td><td><xsl:value-of select="phone"/></td></tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet> |
test.xml
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
| <?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>
toto
</name>
<phone>
1122334455
</phone>
</person>
<person>
<name>
titi
</name>
<phone>
3344556677
</phone>
</person>
<person>
<name>
tata
</name>
<phone>
2233445566
</phone>
</person>
</persons> |
Re: passage de paramètres- transformation serveur
Ceci est un complément à l'article :
http://www.developpez.net/forums/vie...=454740#454740
Citation:
Envoyé par Grégory Picavet
Q: comment passer des paramètres à une feuille XSLT?
Je voulais ajouter :
1/ La solution Javascript énoncée là ne fonctionne malheureusement pas avec FireFox. J'ai donc opté pour une solution en php.
(c'est a dire une modifiaction coté serveur)
2/Dans mon fichier xml, j'avais des attribus au lieu de d'éléments fils
Code:
1 2 3 4 5 6
| <?xml version="1.0" encoding="UTF-8"?>
<persons>
<person name="toto" phone="1122334455" />
<person name="titi" phone="3344556677" />
<person name="tata" phone="2233445566" />
</persons> |
il faut alors remplacer
Code:
<xsl:sort select="*[name()=$field]" order="{$order}"/>
par
Code:
<xsl:sort select="@*[name()=$field]" order="{$order}"/>
(c'est peut être évident, mais j'ai du chercher longtemps!!)
[Grégory PICAVET le 21/04/2006 :
J'ai mis à jour le tri côté client pour Mozilla/Firefox
]
xsl:sort paramétré fonctionnant avec Opera
La commande :
Code:
<xsl:sort select="*[name()=$field]" case-order="upper-first" data-type="text" order="{$order} />
ne fonctionne pas avec Opera, la valeur de $order n'est pas prise en compte.
Cette instruction fonctionne corectement sous IE, Mozilla, FireFoxe, Netscape, SeaMonkey, GranParadiso
Le contournemt pour obtenir un fonctionnement identique ets le suibant :
Code:
1 2 3 4 5 6 7 8 9 10
| <xsl:if test="$order='ascending'">
<xsl:apply-templates select="DMC">
<xsl:sort select="*[name()=$field]" case-order="upper-first" data-type="text" order="ascending" />
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$order='descending'">
<xsl:apply-templates select="DMC">
<xsl:sort select="*[name()=$field]" case-order="upper-first" data-type="text" order='descending' />
</xsl:apply-templates>
</xsl:if> |
[XPath] Rechercher un alément à partir de son contenu
Bonjour,
J'ai pas mal galèré pour trouver la solution à un problème qui paraît plutôt simple :
Citation:
Comment sélectionner un noeud grâce à son contenu !
Si vous souhaiter recherche le contenu
exact du noeud, il faut utiliser le caractère point '.' qui représente la valeur textuelle en cours de lecture. Exemple :
Code:
/project/files/file[.='main.vala']
Ce qui donne :
Code:
1 2 3 4 5 6 7 8 9 10 11
| <?version="1.0" encoding="UTF-8"?>
<project>
<name>test</name>
<files>
<file>main.vala</file>
<file>old_main.vala</file>
</files>
<compiler>
<pkg>gnome</pkg>
</compiler>
</project> |
Ou si vous souhaitez rechercher un noeud
contenant une chaîne :
Code:
/project/files/file[contains(string(),'main.vala')]
Code:
1 2 3 4 5 6 7 8 9 10 11
| <?version="1.0" encoding="UTF-8"?>
<project>
<name>test</name>
<files>
<file>main.vala</file>
<file>old_main.vala</file>
</files>
<compiler>
<pkg>gnome</pkg>
</compiler>
</project> |
Ce qui correspond à rechercher *main.vala*
En espérant que la réponse n'a pas été postée 100 fois sur le forum ;)
[edit]Corrigé grâce aux précieux conseils d'Erwy, merci[/edit]