Bonjour, j'ai deux fichiers XML:
Fichier1
Fichier2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="Template.xsl" type="text/xsl"?> <texte> <phrase nb=1> Ceci est un très bon <nomCand> <obPT Verbe="null" terminaison="ment"/> <mot>développement</mot> </nomCand> . </phrase> <phrase nb=2> La première <nomCand> <obPT Verbe="null" terminaison="tion"/> <mot>formation</mot> </nomCand> de ce genre. </phrase> </texte>
Mon but est de copier le fichier1 en mettant à jour l'attribut "Verbe" de la manière suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?xml version="1.0" encoding="UTF-8"?> <lex> <verbe>former</verbe> <verbe>développer</verbe> <verbe>changer</verbe> <verbe>entrer</verbe> </lex>
1- je regarde si l'attribut "terminaison" est égale à "ment"
2- si oui, je récupère la substring de la chaîne de caractère entre <mot></mot> sans le "ment", ici "développe", et je regarde si dans Fichier2 il y a une entrée <verbe><verbe> qui contient (avec contains) la "substring", si oui
3- je met la valeur de l'entrée <verbe></verbe> correspondante, ici "développer", à la place de "null" à l'attribut "Verbe" du Fichier1.
4-si non, je laisse la valeur "null".
Voici mes feuilles xsl:
Identity.xsl (elle recopie fichier1):
Template.xsl (qui importe Identity.xsl)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method = "xml" encoding="UTF-8" indent='yes'/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
J'aimerais rendre à César ce qui lui appartient, en disant que "Identity.xsl" et une partie de "Template.xsl" proviennent de http://www.dpawson.co.uk/xsl/sect2/i....html#d6349e43.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="Identity.xsl"/> <xsl:template match="@Verbe"> <xsl:choose> <xsl:when test="@terminaison='ment'"> <xsl:if test= "contains(document('fichier2.xml')//verbe,substring(texte/phrase/nomCand/mot,1,index-of(texte/phrase/nomCand/mot,'ment')-1))"> <xsl:attribute name="Verbe"> <xsl:value-of select="replace(.,'null',document('fichier2.xml')//verbe)"/> </xsl:attribute> </xsl:if> </xsl:when> <xsl:otherwise> <xsl:attribute name="Verbe"> <xsl:value-of select="."/> </xsl:attribute> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
J'obtiens ce type d'erreur " The child axis starting at an attribute() node will never select anything", apparement (comme dit dans le titre) cela est dû au fait que les attributs "Verbe" et "terminaison" sont sur le même niveau.
A l'aide![]()
Partager