|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() erwan Développeur Web Inscription : novembre 2003 Messages : 4 980 ![]() |
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 ! |
|
|
00
|
|
|
#2 | ||||
![]() ![]() Inscription : janvier 2003 Messages : 288 ![]() |
je propose de rappeler sommairement ce qu'est xml, xsl, un schema xml, une dtd, xpath, soap, etc... un peu comme la faq java.
coté xsl, voici les questions que j'ai souvent rencontré : Q: comment incrémenter une variable ? R: En xsl, les variables n'existent pas. XSL est un langage purement fonctionnel et déclaratif, donc sans effet de bord, contrairement à un langage procédural comme le C. D'ou l'impossibilité de définir des variables globales. En effet une règle de transformation ne doit dépendre que de ses arguments et de sa définition. Le mot clé xsl:variable ne définit pas en réalité une variable mais une constante. La conséquence d'un programme basé sur un langage fonctionnel comme xsl est qu'il ne peut pas garder d'état. Donc on est obligé de recalculer à chaque fois une information si elle apparaît plusieurs fois. On a donc un langage robuste qui en contrepartie peut aboutir sur des performances assez faibles. La solution est donc soit d'utiliser les fonctions xpath, soit d'implémenter ses propres fonctions récursives Q: comment calculer des numéros de paragraphes dans un document ? R: on utilise la fonction xpath position() qui renvoie la position d'un noeud paragraphe dans le noeud parent Q: comment calculer une somme de valeurs situées dans des noeuds? R: on utilise la fonction xpath sum(...) Code :
Q: comment calculer le total d'une commande? R: les fonctions xpath ne me permette pas d'effectuer un traitement sur mes données.Il faut définir un templates nommés récursif. Avec XSL on peut définir des règles de transformation des noeuds (templates), mais aussi des templates indépendants des noeuds que l'on appeler n'importe ou. Ils sont équivalents à des fonctions. Code :
__________________
"Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses." --Scott Adams |
||||
|
|
00
|
|
|
#3 | ||||||||
![]() ![]() Inscription : janvier 2003 Messages : 288 ![]() |
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 :
Code :
feuille xslt des règles de transfo Code :
Code :
__________________
"Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses." --Scott Adams |
||||||||
|
|
00
|
|
|
#4 | ||||||
|
Membre confirmé
![]() Inscription : mars 2002 Messages : 241 ![]() |
Q: Hé euh ... avec PHP ?
R: Ben, ou utilise la fonction xslt_process. Perso, j'ai deux fichiers include : 1) xslt.inc : Fixe les variables communes à un répertoire Code :
Code :
Finalement, ça s'utilise donc comme ça : (index.php) Code :
répertoire racine : les fichiers PHP (index.php) répertoire xsl/ : les feuilles XSLT (html.xsl) répertoire xml/ : les documents XML (index.xml) @+ Haypo |
||||||
|
|
00
|
|
|
#5 | |||
![]() ![]() erwan Développeur Web Inscription : novembre 2003 Messages : 4 980 ![]() |
Citation:
j'utilise cette methode,un avis? Code :
__________________
modérateur/rédacteur XML Je ne reponds pas aux questions par MP Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation
|
|||
|
|
00
|
|
|
#6 | |
![]() ![]() |
Je proposerais également de rappeler la différence en tre "bien-formé" et "valide", car ce sont deux notions de bases en XML, qui sont parfois mal différenciées par les nouveaux :
Citation:
|
|
|
|
00
|
|
|
#7 | ||||||
|
Membre Expert
![]() ![]() |
Salut l'équipe,
Voila moi deux trucs qui me parait très intéressant a mettre dans la faq c'est: Q1: comment faire un tri variable dans un for-each? Q2:Comment appeler x fois le même template avec des conditions différentes? R1: Ce n'est pas possible (car sort doit être fils de for-each et peu de ce fait pas se trouver dans un if ou un choose en-dessous) il faut passer par un apply-templates et faire un choose afin de définir le tri qu'on veux obtenir: Soit: Code :
si Sort=2 tri par nom seuleument si Sort n'est pas égal à 2, 3 ou il est manquant : pas de tri! R2: il suffit de faire dans l'apply-template un appel avec le condition et dans le xsl:template sans les condition Soit: Code :
et maintenant si on veux par exemple faire un tri en fonction du fonctionnr et si il n'y en a pas les mettre a la fin on combine les deux et ca nous donne: Code :
Si Sort!=1 ou inexistant : pas de tri J'espère que ca vous sera autant utile qu'a moi!!! ++ Thierry |
||||||
|
|
00
|
|
|
#8 | ||||||
|
Membre éprouvé
![]() |
A mon tour d'essayer d'alimenter la FAQ et les trucs et astuces.
Problématique : J'ai eu à réaliser un site intranet, hébergé sur un serveur qui ne tolére que les langages HTML, Javascript et XML. Cependant, je voulais à tout pris ne pas utiliser les frames et essayer d'adopter le système des pseudo frames dont je me sers souvent en PHP. Mais voila, comment faire pour transmettre en paramètres des variables autrement que via l'URL ? Et indiquer au navigateur la page à afficher en fonction du lien cliqué dans le menu. Habituellement, je me sers de la fonction switch de php, mais celle ci n'existe pas en XSLT. Du coup, je me suis servi de <xsl:choose> pour la remplacer. Ma solution Fichier XML (index.xml) : Code :
Code :
Code :
Je déclare dans mon fichier xml une valeur dans un attribut qui va me servir de "variable" (ici, il s'agit de l'attribut "page"). Ensuite, en fonction de cette valeur que je récupère dans mon xsl via <xsl:choose>, j'affiche la page correspondante. Nous avons donc un pseudo-frame en XML/XSL. Je ne sais pas si tout ceci est optimisé ou si il y'a d'autre solutions, mais c'est celle que j'ai trouvé pour résoudre mon problème. A vos critiques....
__________________
Save a tree... Eat a beaver |
||||||
|
|
00
|
|
|
#9 | |||
|
Futur Membre du Club
![]() Inscription : novembre 2005 Messages : 25 ![]() |
Ceci est un complément à l'article :
http://www.developpez.net/forums/vie...=454740#454740 Citation:
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 :
Code :
<xsl:sort select="*[name()=$field]" order="{$order}"/>
Code :
<xsl:sort select="@*[name()=$field]" order="{$order}"/>
[Grégory PICAVET le 21/04/2006 : J'ai mis à jour le tri côté client pour Mozilla/Firefox ] |
|||
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé
![]() ![]() Inscription : janvier 2005 Messages : 2 572 ![]() |
![]() Après avoir bataillé, j'ai trouvé comment utiliser des variables XSL dans du code SVG (je pense être à la limite de la FAQ XML/XSL et SOAP mais je propose quand même Question Réponse Exemple : Code :
C'est bête comme tout mais j'ai cherché la solution longtemps sur le net en vain et personne sur le forum n'a été capable de me répondre(je suppose, plutôt, que la plupart des personnes ont trouvé la question trop simple et dépourvu d'intérêt Donc voilà.
__________________
Pensez au tag ![]() Les règles du Forum Dev. Web : FAQ (X)HTML/CSS | Tutos (X)HTML | Tutos CSS PHP : FAQ PHP | Tutos PHP | Benchmark PHP 5 SQL : Cours SQL |
||
|
|
00
|
|
|
#11 |
![]() ![]() erwan Développeur Web Inscription : novembre 2003 Messages : 4 980 ![]() |
La première version FAQ XML est desormais disponible ici:
http://xml.developpez.com/faq/ Afin de continuer à la faire évoluer mais aussi afin de pouvoir publier prochainement les codes sources XSLT nous avons toujours besoin de votre aide. Je souhaite préciser que nous avons notament besoin sur les informations concernant la validation d'un fichier XML reposant sur un XML Schema, nous attendons vos contributions : Comment valider un XML avec un XSD ?
__________________
modérateur/rédacteur XML Je ne reponds pas aux questions par MP Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation
|
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : mai 2007 Messages : 1 ![]() |
La commande :
<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 : <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> |
|
|
00
|
|
|
#13 | |||||
![]() ![]() Inscription : juin 2004 Messages : 5 850 ![]() |
Bonjour,
J'ai pas mal galèré pour trouver la solution à un problème qui paraît plutôt simple : Citation:
[edit]Corrigé grâce aux précieux conseils d'Erwy, merci[/edit]
__________________
gege2061's blog |
|||||
|
00
|
Copyright © 2000-2012 - www.developpez.com