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 :

[XPath]Problème de récupération de Nom de noeud


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut [XPath]Problème de récupération de Nom de noeud
    Bonjour,

    Je vais vous donner une brève explication de mon problème en espérant être le plus clair possible:
    J'ai un xml genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    <ortho descr="test" doctorEmail="" ...>
       <destinat label="med traitant">Dr. machin rue des lilas ....</destinat>
       <copie label="En copie">à dr Truc</copie>
       <champ1 label="commentaires"></champ1>
      .....
    </ortho>
    Alors moi on m'a appris de la manière suivante à accéder aux éléments :
    Je suis dans une boucle
    <xsl:for-each select="child::*[1]"> De là j'appelle un template "begin"
    (je reprends depuis qqs mois le code de mon prédécesseur, c'est un genre de squelette où il ne reste plus qu'à intégrer les élément ci-dessous)
    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
    ….
    < ...Begin >
    <fo:table-row>
      <xsl:apply-template select="*[1]"/>
     <xsl:apply-template select="*[2]"/>
     <xsl:apply-template select="*[3]"/>
    .....et ainsi de suite
    </...>
    </ ...Begin>
    ….
    <xsl:template match="*">
       <xsl:variable name="name" select="name()"/>
       <xsl:variable name="label" select="@label"/>	
       <xsl:choose>
    	<xsl:when test="$name='champ1'">
    		<xsl:call-template name="elemList"/>
    	</xsl:when>
      </xsl:choose>
    </xsl:template>
    Le problème suivant se pose quand les personnes désirent ajouter un champ (généralement en plein milieu du bazar !!) Imaginons ici en 2eme position tous ce qui se trouvent à la suite est décalé!!

    J'aimerais donc, au lieu d'accéder aux éléments via des numéros y accéder par leur nom par exemple. Donc directement dire si $name=’champ1’ alors call-template ….
    Donc si j’ai bien compris les tutos et cours (ce qui ne doit pas être le cas)
    Dans le « Begin » j’ai mis :
    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
    
    < ...Begin >
    <fo:table-row>
    <for-each select=”*[1]/*”>
      <xsl:apply-template select="."/>
    …
    </for- each>
    </...>
    </ ...Begin>
    
    <xsl:template match="*">
       <xsl:variable name="name" select="name()"/>
       <xsl:variable name="label" select="@label"/>	
       <xsl:choose>
    	<xsl:when test="$name='champ1'">
    		<xsl:call-template name="elemList"/>
    	</xsl:when>
      </xsl:choose>
    </xsl:template>
    Le « . » devrait « entrer » dans mon élément courant non ??

    Si pas comment accéder à ce qui correspond à name() ?? Comment l’utiliser si je fais

    //*[1]/*[1]/child ::text() ou //*[1]/*[1]/@label ça marche pourquoi //*[1]/*[1]/name() ne marche pas ??

    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Petite info, si il y avait moyen de modifier le code le moins possible

    Donc ne pas appeler les templates directement pouvoir passer par mon match=* ça serait bien car je dois passer en revue tous les fichiers et ajouter 5 champs à chaque (pas forcément à la même place) et j'ai bien certainnement + de 500 fichiers.

    Donc si il n'y avait qu'une petite ligne à changer sinon tant pis je dois de tte façon tt changer si je ne trouve pas de solution donc...

    Je comprends maintenant pourquoi il a deminssionné

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    au lieu d'acrire "apply-templates select="*[1]"
    et de le répéter sans cesse...
    moi j aurais écris
    qui s applique à tous les enfants (par ordre d apparition
    ensuite tu écris pour chaque noeud qui t interesse le template correspondant
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="champ1">
     code relatif au champ1
    </xsl:template>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="*">
      template correspondant à tous les éléments non spécifiés comme ci dessus...
    </xsl:template>
    avec ça tu devrais déja t en sortir un peu mieu

  4. #4
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Merci, je vais tester ça!!

  5. #5
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    ça ne marche pas

    Je dois m'y prendre mal, je ne suis pas super douée en xml donc ...

    Enfin en faisant comme mon collègue ça va, mais j'aimerais que ce soit plus maléable (a chaque fois qu'un médeinc veut changer sont formulaire c'est le carnage)...
    Ca prend 1 h où ça pourrait prendre 5 à 10min grd max

    Je montre mon begin (peut être que qqch ne va pas):

    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
    
    <xsl:template name="begin">
      <fo:block/>
        <fo:table table-layout="fixed" border-width="1pt" font-size="11pt">
    	<fo:table-column column-width="11cm"/>
    	<fo:table-body>
    	<xsl:apply-templates/>	
    	</fo:table-body>
        </fo:table>
    </xsl:template>
    
    <xsl:template match="limite1">
       <fo:table-row>
           <fo:table-cell>
    	<fo:block>
    		Test..............
    	</fo:block>
             </fo:table-cell>
       </fo:table-row>
    </xsl:template>
    Mon xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <test>
    ....
     <titre1 label="test" length="10" newline="1" style="txt" title="1 "/>
     <limite1 label="limite">01/01/01</limite1>
     <nolimite1 label="nolimite" >44444444444444444444
            5555555555555</nolimite1>
    ....
    </test>
    Donc, normalement , ça devrait marcher ça?!??

    Merci d'avance

  6. #6
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    rajoute deja ceci au code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="*">
      <xsl:apply-templates/>
    </xsl:template>
    sinon c quoi que tu souhaite écrire dans ton "Test..."

  7. #7
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    je voudrais écrire n'importe koi en fait donc l'idée serait des template pre-formatés c'est à dire que j'ai des champs (comme un formulaire Html mais c'est pas ça comme langage) disons que par exemple pour un "array"

    Je voudrais le champ "label" comme tire ensuite un "enter" puis la valeur de ce champs ce qui donnerais +/-:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    <fo:table-row>
     <fo:table-cell>
       <fo:block>
              <xsl:value-of select="@label">
        <fo:block>
       <fo:block>
             <!--ou une new row-->
              <xsl:value-of select="child::text()">
        <fo:block>
     </fo:table-cell>
    </fo:table-row>
    Comme j'utilisais des templates dejà existant j'ai mis test pour etre certaine que ce ne soit pas les appels du type "@label" ou "child::text()" qui foirent!

    Mais mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    <xsl:template match="*">
      <xsl:apply-templates/>
    </xsl:template>
    Je l'ai mis d'abord dans le "Begin" à la place du <apply-template/> et je l'ai mis en dehors comme un template habituel
    mais ça ne change rien au résultat je nai rien sur mon pdf

    Par contre je fais un appel genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    <xsl:template match="/">
      <xsl:call-templates select="root"/>
    </xsl:template>
    qui lui (root) c'est en fait l'entête de ma page donc le nom de l'hop, les noms des medecins,...

    ce root contient une boucle (for-each="child::*[1]") qui elle même appelle le begin (je comprends bien que cette boucle me permet de récuperer les attributs de l'élement "test" que ce soit un là ce n'est pas un problème je n'ai jamais qu'une note! Mais il est quand même dans cette boucle quand j'appelle le begin ??

    Est -ce que le problème??


  8. #8
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    en résumé tu voudrais un table row pour chaque element label
    et des <fo:block/> pouir chacun de ses enfants?... c ça je lis en travers je suis au travail

  9. #9
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    bhé pas nécessairement, ça c'était un exemple pour un array
    Mais si par exemple j'ai des champs genre
    nom: blabla
    prenom:bibi

    Je voudrais également pouvoir les mettre sur une même ligne, donc 2 colonnes indiquer @label (nomchild::text()(blabla) et sur la meme ligne prenom: bibi

    C'est le format qu'on utilisait déjà avant on à habitué les user à ça donc ils veulent leur format (ce qui dans un sens est normale on economise des pages)

    Donc ça doit etre standard, je veux pouvoir tout faire c'est peut être un gros travail au départ mais ça me permettra par la suite d'être débarrassée de ça

    Moi aussi je suis au boulot (enfin je parle pour le travaille mais on pourrait croire que...)LOL

  10. #10
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    bon le plus simple...
    met un xml, le résultat que tu attends et on va voir

  11. #11
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    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
    
    <note descr="test" doctorEmail="" doctorFirstName="XXX" 
    doctorLastName="XXX" libelle1="Cardiologie" noteDate="20060621"> 
    
    <thedestinataire label="méd traitant(facultatif si connu système)" newline="1"
     style="txt" title="0 ">XXXXX XXX 123456789 rue ...., 55 7777
     localité Belgique</thedestinataire>
    <copie label="Copie" newline="1" style="txt" title="0 ">
       <entry>Docteur1 Stéph. inami Rue ....., 55 7777 Localite Belgique</entry>
       <entry>Docteur2 Jean inami rue ...., 55 7777 loc Belgique</entry>
    </copie>
    <titre1 label="test" length="10" newline="1" style="txt" title="1 "/>
    <dateAdmi label="date"01/01/01</dateAdmi>
    <nompat label="nom">blabla</nompat>
    <prenomPat label="prénom">bibi</prenomPat >
    <adressePat label="adresse">Rue ...... 7777 belgique</adressePat >
    <motif label="Motif d admission">trait.......</motif>
    <trait label="traitement">texte illimité</trait>
    <PSecMed label="impression via secrétariat médical" style="chk">on</PSecMed>
    
    </note>
    Mon résultat serait: (sur un pdf qui contient une entête)

    Date de l'admission: 01/01/01
    nom: blabla prénom:bibi adresse:

    Motif de l'admission
    ------------------
    texte illimté (encadré mais ça c'est pas un problème)

    traitement
    ----------
    trait.......


    Donc j'ai des template qui sont bien définis pour ça on avait déjà travaillé à ça avec mon collègues. Ces templates sont fait c'est à dire que si j'appelle un element "illimité" il me crée 2 Rows, un contenant le titre une autre contenant le texte ce template est alors appelé en dehors d'un row càd directement
    pour cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    <xsl:apply-template="*[6]"/> 
    et ds macth=*" je fais :
     
    <xsl:variable name="name" select="name()"/>
    <xsl:variable name="label" select="@label"/>	
    <xsl:choose>
    	<xsl:when test="$name='motif'">
    	        <xsl:call-template name="elemIllimite"/>
                 </xsl:when>
    </xsl:choose>
    "ElemIllimité" qui fais donc mes 2 rows donc qui est a appeler ds fo:table-body


    Tandis que mon template pour ma date, nom, prenom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    <fo:table-row>
      <xsl:call-template="*[2]"/>
    </fo:table-row>
     
    ==>Match=*
    <xsl:variable name="name" select="name()"/>
    <xsl:variable name="label" select="@label"/>	
    <xsl:choose>
    	<xsl:when test="$name='date'">
    	        <xsl:call-template name="elemLimite"/>
                 </xsl:when>
    </xsl:choose>
    La row je la crée à l'appel du template comme ça je ne fais pas nécessairement une nouvelle ligne

    C'est difficile à expliquer !! j'espère que tu suis!!
    Mais il n'y aurait pas un moyen pour que je connaisse le nom de mon element ds les tutos et cours on nous dit comment recuperer les attributs mais pas le nom lui même. Enfin je pense

    Moi ici si je fais avec la méthode de mon collègue):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    <xsl:variable name="name" select="name()"/>
    Mon $name contiendra le nom de mon element avec ça c'est impec enfin je pense. Je pourrais donc redistribuer mes templates aux elements voulus

    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
     
     
     <xsl:call-template="........."/>
     
    ==>Match=*
    <xsl:variable name="name" select="name()"/>
    <xsl:variable name="label" select="@label"/>	
    <xsl:choose>
    	<xsl:when test="$name='date' or $name='nom' or ...">
    	        <xsl:call-template name="elemLimite"/>
                 </xsl:when>
                  <xsl:when test="$name='motif' or $name='trait' or ...">
    	        <xsl:call-template name="elemIllimite"/>
                 </xsl:when>
    </xsl:choose>
    Donc je voudrais plus ou moins qqch de ce genre si il y a moyen bien sure

  12. #12
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Atta je crois que je viens de trouver grace a toi

    Je te dis koi .... dans 5 min

  13. #13
    Membre averti
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Yesss pour info: (si tu veux savoir c'est tjrs bien!enfin je pense)

    J'ai repris ton bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    <xsl:apply-templates/>
    je ne sais pas pourquoi tout à l'heure ça ne marchait pas mais bon.... j'avais faim pitet!!!

    et je reste avec mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    ==>Match=*
    <xsl:variable name="name" select="name()"/>
    <xsl:variable name="label" select="@label"/>	
    <xsl:choose>
    	<xsl:when test="$name='date' or $name='nom' or ...">
    	        <xsl:call-template name="elemLimite"/>
                 </xsl:when>
                  <xsl:when test="$name='motif' or $name='trait' or ...">
    	        <xsl:call-template name="elemIllimite"/>
                 </xsl:when>
    </xsl:choose>
    et dans ces call je mets ou non mes rows ou autres elements que j'aurais éventuellement besoin (changement des tailles de colonnes etc....)
    ça va charger mon match=* mais ça sera beaucoup plus simple lorsque je voudrai changer un champ
    J'utilise leur nom comme identifiant et hop l'affaire est dans le sac (...enfin j'espere...)LOl

    Merci bcp pour ta patience je vais cliquer sur résolu ...

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Xpath] recherche sur le nom du noeud
    Par need2learn dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/01/2009, 14h48
  2. [XPATH] problème avec le nom des noeud fils
    Par DrDam dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 04/04/2008, 10h02
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43
  4. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

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