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 :

Accéder aux bonnes informations d´un XML à l´aide de XSL et XPath.


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Courgette17
    Invité(e)
    Par défaut Accéder aux bonnes informations d´un XML à l´aide de XSL et XPath.
    J´ai plusieurs fichiers XML structurés de cette maniere:

    Premier fichier d´exemple:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?xml version="1.0" encoding="UTF-8"?>
    <Bar xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" class="1" keys="/Bar/nom;/Bar/Adresse/ligneUn">
      <meta><id>Bar-20090326_131129_744</id>
        <category>Bar</category>
        <author>dcuser</author>
        <last_modified>20090326_131129_748</last_modified>
        <summary>Blue Lagoon Bar ; Fairmont Heliopolis, Urban St.</summary>
      </meta>
      <nom key="1">Blue Lagoon Bar</nom>
      <Adresse class="1">
        <nomUniteUrbaine>Heliopolis</nomUniteUrbaine>
        <ligneUn key="1">Fairmont Heliopolis, Urban St.</ligneUn>
        <ligneDeux/>
        <etatOuProvince/>
        <pays>Egypte</pays>
        <codePostal/>
        <nomDestinationEnglobante/>
      </Adresse>
      <HeuresOuvertureParJour class="1" cnt="1">
        <jourDeLaSemaine>tous</jourDeLaSemaine>
        <heureOuverture>9</heureOuverture>
        <heureFermeture>19</heureFermeture>
        <debutPauseMidi/>
        <finPauseMidi/>
      </HeuresOuvertureParJour>
      <nombrePlaces/>
      <Contact class="1">
        <personneContact/>
        <telephone-1>226 77730</telephone-1>
        <telephone-2>226 77740</telephone-2>
        <fax/>
        <courriel-1/>
        <courriel-2/>
        <URL/>
      </Contact>
      <ServiceBoissons class="1" cnt="1">
        <boissonsServies/>
        <boissonsAlcoolisees>Non</boissonsAlcoolisees>
        <boissonsNonAlcoolisees>Non</boissonsNonAlcoolisees>
        <TarifDeBase class="1">
          <montant/>
          <monnaie/>
          <modeTarification/>
          <typeTarification/>
          <descriptionTextuelle>ok 1</descriptionTextuelle>
        </TarifDeBase>
        <FourchetteTarifaire class="1">
          <tarifMaxmal/>
          <tarifMinimal/>
          <monnaie/>
          <modeTarification/>
          <typeTarification/>
          <descriptionTextuelle>ok FT1</descriptionTextuelle>
        </FourchetteTarifaire>
        <descriptionTextuelle>ok hs1</descriptionTextuelle>
      </ServiceBoissons>
      <descriptionTextuelle>The restaurant offers Oriental cuisine including Mix Grill platters not to mention their range of alcoholic beverages.</descriptionTextuelle>
      <langues>arabe</langues>
      <moyensPaiementAcceptes>argentComptant</moyensPaiementAcceptes>
      <climatisation>yes</climatisation>
      <reservationRequise>yes</reservationRequise>
      <Images class="1">
        <imageFile1 xsi:type="xsd:anyURI" mediatype="" oldPath="" newPath="" imageUrl="" imageThumbUrl=""/>
        <description1/>
        <imageFile2 xsi:type="xsd:anyURI" mediatype="" oldPath="" newPath="" imageUrl="" imageThumbUrl=""/>
        <description2/>
        <imageFile3 xsi:type="xsd:anyURI" mediatype="" oldPath="" newPath="" imageUrl="" imageThumbUrl=""/>
        <description3/>
      </Images>
    </Bar>
    Second fichier d´exemple:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?xml version="1.0" encoding="UTF-8"?>
    <ActiviteSportive xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" class="1" keys="/ActiviteSportive/nom;/ActiviteSportive/aSitePrincipalText">
      <meta><id>ActiviteSportive-20090323_163811_513</id>
        <category>ActiviteSportive</category>
        <author>dcuser</author>
        <last_modified>20090324_170740_955</last_modified>
        <summary>Equitation ; rwettwet</summary>
      </meta>
      <nom key="1">Equitation</nom>
      <typeSport>ski</typeSport>
      <TarifDeBase class="1">
        <montant/>
        <monnaie/>
        <modeTarification/>
        <typeTarification/>
        <descriptionTextuelle/>
      </TarifDeBase>
      <besoinDePermis>no</besoinDePermis>
      <Contact class="1">
        <personneContact>retrt</personneContact>
        <telephone-1/>
        <telephone-2/>
        <telephone-3/>
        <telephone-4/>
        <fax-1/>
        <fax-2/>
        <courriel-1/>
        <courriel-2/>
        <courriel-3/>
      </Contact>
      <aSitePrincipal>SitePublic-20090318_200805_591.xml</aSitePrincipal>
      <aSitesSecondaires-1/>
      <aSitesSecondaires-2/>
      <aSitesSecondaires-3/>
      <aSitePrincipalText key="1">rwettwet</aSitePrincipalText>
      <descriptionTextuelle/>
      <Images class="1">
        <imageFile1 xsi:type="xsd:anyURI" mediatype="" oldPath="" newPath="" imageUrl="" imageThumbUrl=""/>
        <description1/>
        <imageFile2 xsi:type="xsd:anyURI" mediatype="" oldPath="" newPath="" imageUrl="" imageThumbUrl=""/>
        <description2/>
        <imageFile3 xsi:type="xsd:anyURI" mediatype="" oldPath="" newPath="" imageUrl="" imageThumbUrl=""/>
        <description3/>
      </Images>
    </ActiviteSportive>
    Et je dois utiliser un seul fichier XSL pour les mettre en forme (parce que j´en ai 60 des fichiers comme ça).
    Jusque ici j´utilisais des balises dans mon XSL tel que //nom //type pour accéder à chacun des éléments car chaque fichier commence par une balise différente (en l´occurrence Bar et ActiviteSportive).
    Le problème c´est que dans le cas d´une balise tel que <descriptionTextuelle> elle peut se retrouver plusieurs fois dans le fichier. Par exemple dans <TarifDeBase> ou <FourchetteTarifaire>. Du coup lorsque je prends une descriptionTextuelle pour la mettre en forme alors qu´elle est en dehors de tout avec //descriptionTextuelle , le XSL me prend la première qu´il trouve (forcément).

    Est-ce que je peux me passer des // pour récupérer mes informations dans ce cas la? Si oui, comment?
    Est-ce que je peux faire une grande structure conditionnelle (if) pour prendre en compte : Si Bar ou ActiviteSportive alors va chercher l´info la bas?

    Voila tout,

    Merci d´avance

    MadMarc52

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    XPath permet de cibler avec finesse la partie de la structure XML qui t'intéresse.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //TarifDeBase/descriptionTextuelle
    ne sortira que les descriptionTextuelle enfants de TarifDeBase.

    Voir la doc XPath.

  3. #3
    Courgette17
    Invité(e)
    Par défaut
    Admettons que j'ai dans mon XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <TarifDeBase>
    <descriptionTextuelle>
    Blabla1
    </descriptionTextuelle>
    </TarifDeBase>
    <descriptionTextuelle>
    Blabla2
    </descriptionTextuelle>
    Grace à mon XSL, je vais lire Blabla1 lorsque j'indiquerai //descriptionTextuelle alors que en réalité je veux lire Blabla2. Comment je fais surtout parce que la disposition des éléments change en fonction du XML? Je peux préciser Last mais ca reglera le probleme pour un seul XML.

    J'ai déjà un for each pour le contenu des balises dans TarifDeBase.

  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
    Bonjour,

    si j'ai bien saisi, tu veux écrire du code XSLT générique qui s'adapte à tous tes types de schéma ?

    Si c'est bien cela, c'est assez simple : il suffit de rédiger les expressions match des templates pour qu'ils s'appliquent dans un contexte bien précis. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="ServiceBoissons/descriptionTextuelle">
    ...
    </xsl:template>
    <xsl:template match="TarifDeBase/descriptionTextuelle">
    ...
    </xsl:template>
    Lorsque dans un xsl:apply-templates tu sélectionneras des éléments descriptionTextuelle (avec une expression XPath comme //descriptionTextuelle par exemple), le template qui sera appliqué dépendra de leur élément parent (le premier si ce parent est ServiceBoissons, le second si c'est TarifDeBase).

  5. #5
    Courgette17
    Invité(e)
    Par défaut
    Est-ce qu´il y a moyen d´associer plusieurs templates a mon code?
    Ça me convient bien cette idée de template.

    J´aimerais faire quelque chose comme:
    "Prend ce template 1 ou 2 ou 3"
    mais je ne sais pas comment faire.

    Je ne veux pas copier 60 fois mon code (pour le nombre de XML transformé par mon XSL) avec un template pour chacun.

    Ou alors y a t il un code XPATH qui permet de se passer d´un niveau de la hiérarchie? genre comme pour les arborescences de fichiers et repertoires:
    ./ ou ../
    par exemple.

Discussions similaires

  1. [1.x] Accéder aux informations de deux tables liées
    Par chris28200 dans le forum Symfony
    Réponses: 2
    Dernier message: 18/08/2009, 14h22
  2. Accéder aux informations d'un fichier mp3
    Par getz85 dans le forum C#
    Réponses: 3
    Dernier message: 30/04/2009, 12h24
  3. Réponses: 2
    Dernier message: 13/02/2008, 10h58
  4. [Debutant] Accéder aux informations du système de fichiers
    Par Epouvantail dans le forum Débuter
    Réponses: 8
    Dernier message: 30/11/2005, 10h50
  5. [VB.NET]Accéder aux informations d'un PC a distance
    Par Dnx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/10/2005, 11h39

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