Bonjour,
J'utilise xsl:key de manière très classique, et en général je m'en sors sans problème. J'utilise MSXML avec la commande DOS MSXSL.
Je butte actuellement sur une difficulté que je ne m'explique pas. J'ai réussi à la contourner, mais ça ne me plaît pas.
J'ai un gros XML (1) dans lequel je cherche à repérer des éléments, d'après leur contenu textuel. Il y a beaucoup de doublons, sur le critère de ce contenu textuel.
J'ai un petit XML (2) qui contient les contenus textuels qui m'intéressent. Chacun n'apparaît qu'une fois.
Mon XSL tourne sur (1) alors que (2) est appelé par la fonction document(). Il y a une clé xsl:key qui indexe tous les éléments de (1) d'après leur contenu. Je considère les éléments de (2) l'un après l'autre dans une boucle xsl:for-each, qui selectionne les éléments de (2).
Il semble que le contenu de la clé, quand elle est appelée par key() dans la boucle xsl:for-each ne connaisse plus que le contenu de (2). Je ne peux pas récupérer les éléments de (1) dont le texte est semblable à l'élément de (2) courant à chaque passage dans la boucle. On dirait une problème de scope de la xsl:key...
Plus concrètement:
Les documents (1) et (2) sont des mémoires de traduction en TMX. Le (1) est une mémoire vraie, pleine de doublon et de scories, le (2) est une mémoire propre, en anglais seulement. Je veux récupérer toutes les traductions contenues dans (1) correspondant aux textes anglais "propres" répertoriés dans (2).
Extraits du XSL:
Le résultat est 1 pour toutes les itération du for-each, correspondant à l'occurrrence contenue dans (2). La clé a "oublié" le contenu de (1)...
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 <?xml version='1.0'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> [....] <xsl:param name="source-language" select="'en-US'"/> <xsl:param name="target-language" select="'fr-FR'"/> <xsl:key name='bisegment' match='tu' use='tuv/seg'/> <xsl:variable name="$MT-memory" select="document($MTmemFile)"/> <xsl:template match="/tmx"> [...] <xsl:for-each select="$MT-memory//tu"> <xsl:value-of select="count(key('bisegment',tuv[@xml:lang=$source-language]/seg)"/> [...] </xsl:for-each> [...] </xsl:template> [...] </xsl:stylesheet>
Ce n'est pas la première fois que je rencontre ce problème. On peut le contourner en créant une grande variable, fusion des deux documents XML. Le problème de "scope", de portée de la clé ne se pose plus et le résultat est correct. Mais dans le cas présent, les documents sont énormes, alors j'hésite à utiliser cette technique un peu lourde.
Quelqu'un comprend-il la nature du problème ? Quelqu'un a-t-il une bonne solution ?
Merci d'avance.
Christophe.
Partager