Bonsoir,
Je suis en train de coder un éditeur xml générique (pour éditer n'importe
quel fichier xml) via des formulaires web (utilisation en intranet).
Le principe consiste à créer un fichier xml de paramétrage qui décrit
"comment" le fichier xml doit être éditer.
Un exemple ...
Je veux éditer un fichier xml de cette forme :
monFichier.xml
<BIBLIO>
<LIVRE titre="l'étranger">
<AUTEUR ref="1234"/>
<AUTEUR ref="0523"/>
</LIVRE>
<LIVRE titre="les thanatonautes">
<AUTEUR ref="1234"/>
</LIVRE>
etc...
</BIBLIO>
disons qu'il peut y avoir plusieurs co-auteurs pour le même livre.
Chaque auteur étant définis dans un autre fichier xml (nom, prénom, etc.)
Le fichier param.xml spécifies plusieurs choses :
- les règles d'agencement des differents noeuds (et attributs) ==> ce que
dit la dtd (ou le schema xml)
- la manière dont chaque noeud doit être édité (quel type de champs
etc...)
voici a quoi il pourrait ressembler pour l'exemple ci-dessus :
param.xml
<NODES>
<NODE name="BIBLIO" label="Bibliothèque">
<NODE name="LIVRE" label="Bibliothèque" minOccurs="0"
maxOccurs="unbounded">
<ATTRIBUTE name="titre" label="Titre" form="text_inline"/>
<NODE name="AUTEUR" label="Auteur" minOccurs="1" maxOccurs="unbounded"
form="list_externalXML('auteurs.xml')"/>
</NODE>
</NODE>
</NODES>
comme vous pouvez le constatez je m'inspire grandement de la syntaxe des
schemas w3c, et pour cause ce fichier a, entre autre, le même rôle. Bien
entendu j'aurai largement préféré utiliser directement le schema mais il y
manque des infos pour ce que je veux faire.
Voila en substance ce que dit ce fichier :
"La racine du fichier à éditer est un noeud <BIBLIO> qui sera afficher sous
le nom "Bibliothèque" pour les utilisateurs. Sous ce noeud il y aura de 0 à
l'infini noeuds <LIVRE> qui auront chacun un attribut titre renseigné par
l'utilisateur via un formulaire de type text_inline (concretement <input
type="text">). Sous ce noeud il y a de 1 à l'infinis noeuds <AUTEUR>, qui
seront renseignés par l'utilisateur via une liste de données provenant de
auteurs.xml (concretement <select> avec des <option> remplies grâce à
document('auteur.xml')... il faudrait ajouter des paramètre ici mais je n'en
suis pas encore là.)"
Bref pour en venir à mon problème, dans mon fichier xsl qui affiche
l'édition du fichier xml il faut que je fasse la correspondance entre les
noeuds matchés dans monFichier.xml et ceux de param.xml
j'y suis arrivé de la manière suivante :
au moment où je match le livre "l'étranger" je créé une variable
<xsl:variable name="CorrespondingPathInParamXML">
<xsl:for-each select="ancestor-or-self::*">/NODE[@name='<xsl:value-of
select="name()"/>']</xsl:for-each>
</xsl:variable>
cette variable contient le chemin Xpath qui permet d'atteindre <NODE
name="LIVRE" ...> dans param.xml, dans ce cas cette variable vaut :
/NODE[@name="BIBLIO"]/NODE[@name="LIVRE"]
enuite je peux connaitre les caractéristiques que doit avoir le noeud en
faisant
<xsl:for-each select="document('param.xml')/NODES">
<xsl:for-each select="dyn:evaluate(.,$CorrespondingPathInParamXML)">
enfin ceci est un peu résumé évidement mais le principe est là.
J'ai souvent besoin de faire cette correspondance dans ma xsl, j'aimerai
pouvoir simplifier ceci, par appel d'un template par exmple qui me
permettrai de passer provisoirement sur le noeud correspondant et revenir au
noeud contextuel juste après.
Ou peut-être utiliser xsl:key pour faire plus facilement cette correpondance
assez redondante mais je ne vois pas trop comment...
Avez vous des idées ?
suggestions et critiques sur le principe sont aussi les bienvenues :) !
Matthieu.
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Wed Apr 6 18:10:56 2005