IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Portée de xsl:key


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Terminologue
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Terminologue
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Par défaut Portée de xsl:key
    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:

    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>
    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)...

    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.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    En fait c'est plutôt la fonction key() qui a une portée.

    <xsl:key> est essentiellement un directive qui dit de créer un index de clés pour chaque document rencontré. Les index de deux documents distincts, ne se mélangent pas.
    La fonction key(), quand on l'appelle, cherche donc dans l'index d'un document, et un seul, bien précis. Lequel, c'est simplement celui qui contient le nœud current().

    Une solution serait de faire deux appels : le premier pour le document en cours, résultat mis dans une variable, le second dans un for-each qui ne fait que sélectionner l'autre document, résultat mis dans une deuxième variable, puis compter $var1 | $var2
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Terminologue
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Terminologue
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Par défaut
    OK, merci. Au moins je comprends ce qui se passe. Je vais réfléchir à l'utilisation des variables.
    Encore une question : est-ce qu'en jouant sur les namespace, on peut forcer key() à considérer l'autre document ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    What ? Non... Qu'est-ce que les namespaces viennent faire là-dedans ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Rassemblement des noeuds, maximum et xsl:key
    Par mlny84 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 03/06/2008, 16h19
  2. [XSLT] Utilisation de xsl:key
    Par blupin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/09/2007, 10h45
  3. [XSLT] peut on faire un select dans un xsl:key ?
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/10/2006, 13h06
  4. [XSLT] Regroupement en utilsant xsl:key
    Par AVRAVR dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/07/2006, 10h02
  5. [XSL] recherche infos sur xsl:key
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 17/02/2006, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo