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 :

Parcours d'une arborescence sans repasser par un meme fichier


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut Parcours d'une arborescence sans repasser par un meme fichier
    Bonjour,

    Je suis loin d'être a l'aise avec XSLT et j'ai un problème dont je ne vois pas de solution évidente.

    A partir d'une arborescence de fichiers XML chapeauté par un fichier XML racine, je dois créer un fichier résultat (au format Docbook mais c'est une autre histoire...) qui me liste les composants que j'utilise (qui ne sont rien d'autre que des fichier feuilles de mon arbre lié a la racine).
    Or rien n'empêche différents enfants de ma racine d'utiliser les mêmes feuilles.

    Ma transformation XSLT génère donc un fichier avec plusieurs occurrences de certaines feuilles.
    Bien sur, je peux faire une deuxième passe pour supprimer les doublons, mais je préférai faire ça a la volée.

    J'avais dans l'idée de tenir une liste des feuilles visitées pour éviter de revisiter une feuille deux fois, mais j'ai de sérieux doutes sur la faisabilité de ce genre de chose avec une variable.
    Ça me protège des redécouvertes des feuilles visitées par les parents mais pas les frères.

    Je pense que c'est un problème recrurent pour ceux qui débutent en XSLT venant de la programmation classique mais j'avoue ne pas avoir trouve de solution par moi même (sans doute pas les bon mots clés).

    Si vous avez des pointeurs ou des idées je suis preneur.

    cordialement,

    /JLB
    S'il n'y a pas de solutions, il n'y a pas de problème.

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Citation Envoyé par JMLLB Voir le message
    Or rien n'empêche différents enfants de ma racine d'utiliser les mêmes feuilles.
    Dans ce cas il ne s'agit plus d'une arborescence mais d'un graphe.

    Quand tu dis qu'ils utilisent les mêmes feuilles, cela signifie-t-il que ces feuilles portent le même nom, ou ont une autre caractéristique commune ? Si c'est le cas, tu peux tester pour chaque feuille rencontrée si il n'en figure pas une autre occurrence dans une branche déjà parcourue. Quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:if test="not(preceding::feuille[@name = current()/@name])">
    <!-- On traite la feuille, il n'y a pas d'autres occurrences -->
    ...
    </xsl:if>
    Mais peut-être qu'un petit échantillon du document à parcourir permettrait d'être plus spécifique...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Bonjour,

    Merci pour la rapidité de ta réponse.

    Voici qq détails supplémentaires sur mon cas.

    Mon document est un ensemble de script.
    Le script principal fait appel a des fonctions, faisant elles même appel a des fonctions.
    Chaque fonction est un fichier xml distinct qui donne le path des fonctions qu'il utilise.
    Ces fichiers sont générés par une application graphique qui me garantie contre les problèmes de bouclage.

    Je joins un graphe pour visualiser le problème.

    Le fichier feuille2.xml est inclus a la fois par enfant1.xml et enfant2.xml.
    Images attachées Images attachées  
    S'il n'y a pas de solutions, il n'y a pas de problème.

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Comment se manifeste concrètement « l'inclusion » ? Par la présence d'un nom de fichier XML « enfant » comme valeur d'un attribut ou d'un élément d'un document XML « parent » ?

    La solution XSLT variera grandement selon la façon dont cette relation est implémentée dans les documents, en conséquence la fourniture d'un échantillon de tes sources XML augmenterait grandement la chance de parvenir à obtenir une réponse...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Voila a quoi ressemble le corps d'un script:
    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
    25
    26
    27
    28
    <script>
      <references>
        <reference datapath="./script1.xml"></reference>
        <reference datapath="./script2.xml"></reference>
        <reference datapath="./script3.xml"></reference>
      </references>
      <functions>
        <function name="funct1" datapath="./tmp/LIB/funct1.xml">
          <params>
            <param name="return" type="integer" desc="blabla" direction="out"/>
            <param name="x1" type="integer" desc="blabla" direction="in"/>
            <param name="x2" type="integer" desc="blabla" direction="inout"/>
            <param name="x3" type="integer" desc="blabla" direction="out"/>
          </params>
        </function>
        <function name="funct2" datapath="./tmp/LIB/funct2.xml">
          <params>
            <param name="return" type="integer" desc="blabla" direction="out"/>
            <param name="y1" type="integer" desc="blabla" direction="in"/>
            <param name="y2" type="integer" desc="blabla" direction="inout"/>
            <param name="y3" type="integer" desc="blabla" direction="out"/>
          </params>
        </function>
      </functions>
      <main>
      ...
      <main>
    </script>
    L'idée est a partir du script chapeau parser tout le graphe et produire la liste des fonctions utilisées.
    Pour l'instant je le fais avec des doublons.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <functions>
      <function><name>funct1</name></function>
      <function><name>funct2</name></function>
      <function><name>funct3</name></function>
      <function><name>funct4</name></function>
      <function><name>funct5</name></function>
    </functions>
    Pour ce faire la transformation est la suivante:
    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
    <functions>
      <xsl:apply-templates mode="SCRIPT" select="/script" />
    </functions>
     
    <xsl:template match="script" mode="SCRIPT">
      <xsl:apply-templates mode="FUNCTIONS" select="functions" />
     
      <xsl:for-each select="references/reference">
        <xsl:apply-templates mode="SCRIPT" select="document(@datapath)/script" />
      </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="functions" mode="FUNCTIONS">
      <xsl:for-each select="function">
      <function><name><xsl:value-of select="@name" /></name></function>
      </xsl:for-each>
    </xsl:template>
    NB: Ce n'est pas le code réel, j'ai retranscrit l'idée générale. Le format réel étant a la fois touffu (généré par une appli est pas destiné a être édite) et plus ou moins confidentiel. Donc gare aux coquilles...
    S'il n'y a pas de solutions, il n'y a pas de problème.

Discussions similaires

  1. Envoyer une télécopie sans passer par l'assistant de télécopie
    Par therouxy dans le forum Composants VCL
    Réponses: 5
    Dernier message: 09/10/2006, 11h05
  2. Réponses: 5
    Dernier message: 13/04/2006, 22h54
  3. [VBA-A]Parcours d'une arborescence dossiers et fichiers
    Par sidneyvba dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/03/2006, 16h58
  4. Réponses: 10
    Dernier message: 27/01/2006, 09h43
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13

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