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 :

[XML/XSL/XSD] Ordre des balises pour vérification


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 38
    Points : 18
    Points
    18
    Par défaut [XML/XSL/XSD] Ordre des balises pour vérification
    Bonjour à tous!

    Après avoir énormément paufiné les cours sur XPath (encore merci pour le nom!) j'ai pu modifier directement tout un tas de contrôle et de calculs qui était réalisé par un code en VB (division, valeurs conditionnées par des IF ou des Choose, tests sur balises vides, etc.).

    Mon fichier XML de sortie est donc vraiment pas mal! Par contre, avant traitement final, il doit passer par un fichier XSD (non modifiable). Et dans ce fichier XSD, l'ordre des balises doit impérativement être respecté.

    J'ai tenté d'agencer les balises "template" du XSL pour répondre à l'ordre attendu par le XSD, mais je me suis aperçu que ce n'est pas l'ordre du template qui importe, mais celui du fichier XML d'entrée.

    Du coup, quelle est la meilleure solution pour remettre les balises dans l'ordre attendu par le XSD?
    - Remodifier le fichier XML par le code VB (ouch...)?
    - Repasser par un nouveau XSL?
    - Autre (encore une fois, avec tout qui se mélange dans ma tête, j'ai du mal à envisager d'autres solutions)?

    Merci d'avance pour le coup de main

    Un petit exemple:
    Fichier d'entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <NOM>DUPOND</NOM>
    <PRENOM>Jean</PRENOM>
    Fichier de sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <NOM>DUPOND</NOM>
    <PersonID>DUPOND Jean</PersonID>
    <PRENOM>Jean</PRENOM>
    Ordre dans le fichier XSD:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:all>
         <xs:element type="xs:string" name="PRENOM"/>
         <xs:element type="xs:string" name="NOM"/>
         <xs:element type="xs:string" name="PersonID"/>
    </xs:all>

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello,

    Le XSD que tu nous montres n'impose aucun ordre. <xs:all> te laisse libre de mettre les éléments dans l'ordre que tu veux. C'est <xs:sequence> qui impose un ordre.

    Mais si tu veux respecter un ordre précis, il suffit de faire en sorte que tes templates XSLT imposent eux-même l'ordre des éléments qu'ils contiennent, au lieu de respecter celui du XML.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="personne">
      <personne>
        <xsl:apply-templates select="prenom"/>
        <xsl:apply-templates select="nom"/>
        <person-id><xsl:value-of select="concat(nom, ' ', prenom)"/></person-id>
      </personne>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Ah oui en effet, je n'ai pas pris les bonnes données dans le XSD

    Apparemment, l'utilisation de sequence a été choisi pour spécifier qu'une balise peut être absente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xs:sequence>
    			<xs:element type="xs:string" name="NOM"/>
    			<xs:element type="xs:string" name="PRENOM"/>
    			<xs:element type="xs:string" name="PersonID"/>
    			<xs:element type="xs:string" name="ADRESSE" minOccurs="0"/>
    </xs:sequence>
    Je vais essayer d'appliquer de nouveaux templates dans mon XSL pour le remettre en forme. Merci pour l'info!

    EDIT: Parfait, il a fallu que je revois toutes les balises du XSL, mais comme j'avais conservé une copie de ma tentaive pour tout agencer, je m'en sors sans trop de complications!
    C'est finalement tout bête, ou en tout cas, beaucoup plus clair dans mon esprit!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Tiens d'ailleurs, plutôt que d'ouvrir un nouveau topic pour une simple question, je vais la poser directement ici: Est-il possible de charger des données contenues dans un autre fichier (un fichier de config par exemple).

    L'idée étant de créer une balise spécifique avec l'information contenue dans le fichier (genre config.ini).

    XML d'entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <NOM>DUPOND</NOM>
    <PRENOM>Jean</PRENOM>
    Fichier de config.ini:
    XML de sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <NOM>DUPOND</NOM>
    <PRENOM>Jean</PRENOM>
    <DATABASE>LDAP1</DATABASE>

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Avec un .ini, non. (Enfin, c'est faisable en XSLT 2.0 mais pas bien malin.)

    Il y a essentiellement deux façons de faire :
    - Passer des paramètres à la feuille XSTL.

    Du coup ta feuille aura un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:param name="database"/>
    et s'en servirait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="personne">
      <personne>
        <xsl:apply-templates/>
        <database><xsl:value-of select="$database"/></database>
      </personne>
    </xsl:template>
    Encore faut-il que ton système soit capable de passer des paramètres au moteur XSLT. Et dans ce cas-là, c'est ton système qui va aller lire la config et la transmettre. Ce qui te permet d'utiliser un .ini ou ce que tu veux, de manière assez propre.

    OU

    - utiliser document() pour lire un autre fichier XML.

    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="config" select="document('config.xml')/*/param"/>
    Avec config.xml qui contiendrait un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <config>
      <param name="database">ldap</param>
      <param name="protocol">http</param>
    </config>
    et qui s'utiliserait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="personne">
      <personne>
        <xsl:apply-templates/>
        <database><xsl:value-of select="$config[@name='database']"/></database>
      </personne>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Bonjour thelvin,

    Après mûre réflexion (la nuit porte conseil), je pense que je vais utiliser un mélange entre les deux solutions.

    Avec mon code en VB, je vais générer un fichier XML à partir des informations contenues dans le fichier ini (car celui ci est utilisé par d'autres outils). Du coup, je n'ai qu'à modifier mes XSL pour intégrer le contenu de ce fichier XML.

    Bon ben y'a plus qu'à, encore merci pour toutes les infos!

    EDIT: J'ai un ooups... Lors de l’exécution, j'ai l'erreur suivante:

    L'exécution de la fonction 'document()' est interdite. Utilisez la propriété XsltSettings.EnableDocumentFunction pour l'activer

    Je suis en XML 1.0, est XSL 3.0, si ca peut aider.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    J'ai beau chercher, je n'arrive pas à trouver comment typer ma variable pour pouvoir activer la fonction.

    ce que je fais actuellement:

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            'Ouvrir et lire le XML ADAPDS
            document = New XmlDocument()
            document.Load(Personnes)
     
            ' create navigator
            navigator = document.CreateNavigator
     
            ' load style sheet XSL ADAPDS
            transformer = New XslCompiledTransform()
            transformer.Load(Current_Directory & "\XSL\Personnes.xsl")
     
            ' transform XML data
            NewPerson_out = New StringWriter()
            transformer.Transform(navigator, Nothing, NewPerson_out) 'C'est ici que j'ai mon message d'erreur sur l'utilisation de document()

    J'ai eu beau tenté de rajouter :
    document.setProperty("AllowDocumentFunction", True) mais setProperty n'appartient pas à XmlDocument.
    J'ai donc voulu typer document en Msxml2.DOMDocument.6.0, mais cet objet n'est pas reconnu par VB (CreateObject("Msxml2.DOMDocument.6.0″) )
    Idem en essayant de rajouter la fonction AllowDocumentFunction dans la fonction transformer.Transform....

    EDIT: Et bien à force d'insister, ca a fini par payer.... En fait c'est tout bête, la fonction Load du XslCompiledTransform() peut prendre plusieurs paramètres (comme je n'en avait mis qu'un, je ne voiyais pas qu'elle était surchargée... merci la doc MSDN)

    Du coup, il suffit d'ajouter dans le code VB:

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim settings As New Xml.Xsl.XsltSettings
            settings.EnableDocumentFunction = True

    Pour permettre la fonction Load de prendre:
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
            transformer.Load(Current_Directory & "\XSL\Personnes.xsl", settings, Nothing)


  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Ouaip. Je ne connais rien aux APIs Microsoft, mais j'étais arrivé à la même conclusion en allant consulter la doc.

    Pour la leur je ne sais pas, mais pour quatre langages que j'utilise, c'est toujours une bonne idée de commencer par là.
    Du coup c'est bien d'être allé le faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Disons que je ne sais pas comment sont les docs que tu utilisent, mais j'ai quand même pas mal galérer pour trouver l'info en VB (donc si ça peut en aider d'autres).

    En fait, il te disent que la propriété est sur les XSL, donc j'ai voulu typer mon document en XSL ==> Ca ne fonctionnait pas.
    Après, j'ai lu de la doc sur les objets DOM, mais idem, ca n'a pas résolu mon problème.

    Je suis donc revenu la où j'avais mon erreur (la fonction Load du XslCompiledTransform). Et c'est en allant regarder la doc de cette fonction que j'ai (enfin) trouver mon bonheur...

    M'enfin ça y est, je pense toucher au but. Plus qu'une comparaison de date à faire, et ça sera terminé!

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

Discussions similaires

  1. Validation XML par XSD et ordre des balises
    Par Bz dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 03/06/2015, 22h19
  2. [JAXB] Ordre des balises dans le xml généré - @XmlType(propOrder - IllegalAnnotationsException
    Par OrigineDeLaVie dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 29/08/2013, 17h52
  3. XML contenu des balises pour des images
    Par boitalette dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/10/2009, 19h36
  4. [XSLT]Modifier l'ordre des balises XML
    Par Philos15 dans le forum XSL/XSLT/XPATH
    Réponses: 12
    Dernier message: 18/10/2006, 10h54
  5. [XML] validation de fichier XML:l'ordre des balises compte ?
    Par longbeach dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/09/2005, 19h53

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