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

XML/XSL et SOAP Discussion :

XSLT Exporter en CSV avec ligne des nom des champs


Sujet :

XML/XSL et SOAP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 64
    Points : 58
    Points
    58
    Par défaut XSLT Exporter en CSV avec ligne des nom des champs
    Bonjour,
    Problématique :
    1)
    Mes connaissances théoriques sur XML et XSL se fritent et s'effritent à l'épreuve de la mise en application.
    Certes le "bon code" m'intéresse en premier lieu.
    Mais si vous pouviez mettre des commentaires afin que je comprenne (enfin) ce que le code réalise, ça serait super !
    2)
    À partir de fichier XML, j'essaye d'exporter un fichier CSV dont la 1ère ligne contient le nom des champs (balise).
    Le signe séparateur est le point-virgule.
    J'essaye d'avoir une seule feuille XSL pour effectuer cette transformation.
    3)
    Dans la feuille XSL,
    si j'utilise : <xsl:output method="text" /> Rien ne sort.
    Si j'utilise : <xsl:output method="xml" /> Il y a un rajout d'une ligne XML
    J'utilise le code suivant pour sauvegarder le résultat :
    Set result = createobject("Msxml2.DOMDocument.6.0")
    result.async = "false"
    result.validateOnParse = "false"
    ObjRacine.TransformNodeToObject Stylesheet, Result
    Result.Save NomFichier & ".txt"
    Manque de chance, cette suite d'instruction me rajoute en 1ère ligne : <?xml version="1.0" encoding="utf-8" standalone="no"?>
    Et je ne veux pas de cette ligne !
    Comment faire si <xsl:output method="text" /> ne "fonctionne" pas ?

    Grand Merci d'avance pour votre aide.
    Cordialement.

    Fichier Input No 1
    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
     
    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <ArcOgefi>
     <PAP>
      <Version>V0.0</Version>
      <DateTraitement>30/04/2014 10:56:58</DateTraitement>
     </PAP>
     <OGEFI>
      <SUBVENTION Extrac="01/01/2014">
       <NoProjet MOV_PROJ="123AZ">
        <MntSubvention MOV_CR="4186610,38">
         <MOV_ACCT>13130000</MOV_ACCT>
         <MOV_NAME>A NOUVEAUX</MOV_NAME>
         <A_Exclure>
          <MOV_SYSDATE>29/04/2014</MOV_SYSDATE>
         </A_Exclure>
        </MntSubvention>
       </NoProjet>
       <NoProjet MOV_PROJ="456ER">
        <MntSubvention MOV_CR="1154852,21">
         <MOV_ACCT>13130000</MOV_ACCT>
         <MOV_NAME>A NOUVEAUX</MOV_NAME>
         <A_Exclure>
          <MOV_SYSDATE>29/04/2014</MOV_SYSDATE>
         </A_Exclure>
        </MntSubvention>
       </NoProjet>
      </SUBVENTION>
     </OGEFI>
    </ArcOgefi>
    Fichier Input No 2
    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" encoding="utf-8" standalone="no"?>
    <PAIE Extrac="25/03/2014">
     <DatePaie MOV_BAL_DATE="3/25/2014">
      <Tiers LEDGER="F11007">
       <MOV_DOC>42000135</MOV_DOC>
       <MOV_INVOICE>5673-01244</MOV_INVOICE>
      </Tiers>
      <Tiers LEDGER="F11007">
       <MOV_DOC>42000136</MOV_DOC>
       <MOV_INVOICE>290114</MOV_INVOICE>
      </Tiers>
     </DatePaie>
     <DatePaie MOV_BAL_DATE="3/27/2014">
      <Tiers LEDGER="F00050">
       <MOV_DOC>49000270</MOV_DOC>
       <MOV_INVOICE>37091847</MOV_INVOICE>
      </Tiers>
     </DatePaie>
    </PAIE>
    Fichier Output No 1 (souhaité)
    SUBVENTION;MOV_PROJ;MOV_CR;MOV_ACCT;MOV_NAME
    SUBVENTION;123AZ;4186610,38;13130000;A NOUVEAUX
    SUBVENTION;456ER;1154852,21;13130000;A NOUVEAUX
    Fichier Output No 2 (souhaité)
    PAIE;MOV_BAL_DATE;LEDGER;MOV_DOC;MOV_INVOICE
    PAIE;3/25/2014;F11007;42000135;5673-01244
    PAIE;3/25/2014;F11007;42000136;290114
    PAIE;3/27/2014;F00050;49000270;37091847
    Code mélangeant Choux et Carottes
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" />
     
    <xsl:template match="/">
     <xsl:apply-templates select="//SUBVENTION" /> <!-- SUBVENTION est passé en paramètre -->
    </xsl:template>
     
    <xsl:template match="A_Exclure"> 
    </xsl:template>
     
    <xsl:template match="SUBVENTION"> <!-- Je cherche à ne sortir que le nom des balises -->
             <xsl:for-each select=".[position()=1]/*">
                   <xsl:value-of select="./name()"/>
             </xsl:for-each>"
    </xsl:template>
     
    <xsl:template match="node()|@*">
     <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
    </xsl:template>
     
    </xsl:stylesheet>

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    D'abord, le xslt contient bien de problèmes. Vous ne devrez tirer de conclusions trop tôt sur le fonctionnement du projet msxml2 : ça risque de vous égarer vous-même à cause de xslt érroné.

    [1] Si vous voulez sortir un texte de par une transformation, comme un csv est, il est logique de préciser le xsl:output avec l'attribut méthode text. Faites bien celà avant d'expérimenter l'attribut méthode xml.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:output method="text" />
    [1.1] Et bien, avec method="text", il ne faut pas utiliser la méthode TransformNodeToObject(). Jamais. Il faut utilser la méthode TransformNode(), et c'est obligatoire.
    Code vbscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'ObjRacine.TransformNodeToObject Stylesheet, Result
    'Result.Save NomFichier & ".txt"
    Result=ObjRacine.TransformNodeToObject(Stylesheet)    'Result ici est un texte
    'Faire persistence le Result par Scripting.FileSystemObject, comme d'habitude...
        'Pour regarder facilement
        wscript.echo Result

    [2] Maintenant, le xslt. Je ne vais pas mener les corrections en détails, c'est trop fatiguant et les problème, il y en a beaucoup.

    [2.1] Il y a des problèmes liés aux xpaths, vous devrez en découvre vous-même par une solution que je vais proposer. C'est difficile à raconter un à un, c'est une tache presque impossible si vous n'êtes pas du tout prêt... Par exemple, une construction comme ceci est tout à fait fausse
    .[position()=1]
    [2.2] Et puis, il y a des problèmes de construction xslt qui ne sont pas tout à fait évident si vous ne connaissez pas bien.

    [3] Voici une possible réalization pour le fichier no 1. (Msxml2 ne supporte pas xslt 2.0, il n'y a aucune raison de mettre version="2.0" dans xslt.)
    Code xml : 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
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" />
     
    <xsl:template match="/">
        <xsl:apply-templates select="//SUBVENTION[position()=1]" mode="head" />
        <xsl:text>&#x0d;&#x0a;</xsl:text>
        <xsl:apply-templates select="//SUBVENTION" mode="data" />
    </xsl:template>
     
    <xsl:template match="SUBVENTION" mode="head">
        <xsl:value-of select="name()" />
        <xsl:text>;</xsl:text>
        <xsl:for-each select="NoProjet[position()=1]//@*|NoProjet[position()=1]//*[not(*)]">
            <xsl:value-of select="name()"/>
            <xsl:if test="position() != last()">
                <xsl:text>;</xsl:text>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="SUBVENTION" mode="data">
        <xsl:apply-templates select="NoProjet" mode="data" />
    </xsl:template>
    <xsl:template match="NoProjet[parent::SUBVENTION]" mode="data">
        <xsl:value-of select="name(parent::*)" />
        <xsl:text>;</xsl:text>
        <xsl:for-each select=".//@*|.//*[not(*)]">
            <xsl:value-of select="normalize-space()"/>
            <xsl:if test="position() != last()">
                <xsl:text>;</xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text>&#x0d;&#x0a;</xsl:text>
    </xsl:template>
    </xsl:stylesheet>

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Plus important : il aurait été bien plus facile de faire ça en VBA qu'en XSLT -_-°.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    @thelvin:
    Vient de l'ouvrage (page 19) : 2002 - Eyrolles - XSLT_fondamental - Philippe Drix
    En effet, un des problèmes de XSL en général et de XSLT en
    particulier, est que ce sont des langages assez déstabilisants, dans la mesure où ils
    demandent aux programmeurs des compétences dans des domaines qui sont générale-
    ment assez peu fréquentés. Un expert XSLT mettra très certainement beaucoup moins de
    temps à réaliser le traitement demandé que l’expert Java utilisant les API SAX (Simple
    API for XML) ou DOM (Document Object Model) pour faire le même travail ; le seul
    problème, à vrai dire, est d’être expert XSLT.
    ...
    A l’inverse, prenez un expert SQL, ou Java, ou C, ou Visual Basic, et présentez-lui
    XSLT : il n’aura pratiquement rien à quoi se raccrocher ; tout pour lui sera nouveau ou
    presque, sauf s’il a une bonne culture dans le domaine des langages fonctionnels ou
    déclaratifs (Prolog, Lisp, Caml, etc.).
    Pourtant, il ne faut pas croire que XSLT soit un langage spécialement difficile ou com-
    plexe ; il est même beaucoup moins complexe que C++. Mais il est déroutant, parce qu’il
    nous fait pénétrer dans un monde auquel nous ne sommes en général pas habitués.
    En résumé, si vous avez à faire un traitement non trivial sur un document XML, et que
    vous êtes novice en XSLT, prévoyez une phase importante d’investissement personnel
    initial dans le calcul de votre délai, ou réalisez votre traitement en programmation tradi-
    tionnelle, avec des API comme SAX ou DOM. Mais ce n’est pas une solution rentable à
    moyen terme, car il est certain qu’une fois la compétence acquise, on est beaucoup plus
    efficace en XSLT qu’on peut l’être en Java ou C++ pour réaliser une transformation
    donnée.
    C'est vrai qu'en VBScript - que j'utilise actuellement - je n'aurai même pas posté sur le Forum car mon pg serait fini depuis longtemp.
    Mais c'est un choix : XML devient de plus en plus utilisé et j'ai décidé de monter en compétence ... même si ce n'est pas facile.

    @tsuji :
    Grand merci pour ta réponse.
    Je suis en train de mettre en oeuvre ta prose, en testant différents cas pour bien comprendre.
    Je compte faire un compte-rendu pour finaliser cette discution.
    Merci encore.
    Cordialement.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    L'ouvrage que tu cites, n'imaginait pas une seule seconde que tu essaierais d'utiliser XSLT pour faire du CSV, c'est à dire ni du texte ni du HTML ni du XML, mais un format pour lequel XSLT n'est pas prévu.

    Alors oui, on peut considérer que quelque part, CSV c'est du texte avec des virgules, donc ça doit être faisable. Faisable oui, je le ferais sans problème. Mais fait pour non, je le ferais encore plus vite et bien plus clairement en Java, Python, Ruby ou C#. Pas parce que je suis meilleur dans ces langages (je ne le suis qu'en Java,) mais parce que XSLT est moins bon qu'eux pour ça.

    De toute façon ça se voit bien que le code proposé est plein d'abominations invraisemblables, alors que dans un langage impératif ça se fait simplement et en un tournemain.

    Après si c'est un exercice bon, chacun s'entraîne comme il veut, mais moi je recommanderais plutôt un cas qui serait adapté dans le monde réel, genre faire un fichier XML plat au lieu du CSV demandé.
    Monter en compétence XML c'est bien, mais déjà, je suis pas sûr que XSLT soit si demandé que ça. Mais surtout monter en compétence, ça veut dire aussi savoir quand l'outil est adapté. Et XSLT n'est pas spécialement adapté pour faire du CSV, il peut le faire, mais n'importe quoi le fait mieux, or là tu as déjà du VBA vu que c'est avec ça que tu lances la transformation. Tu penses que tu auras l'air de quoi, si tu te vantes de ça auprès de gens compétents techniquement ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    Je suis d'accord avec toi : Sortir simplement du CSV en utilisant XSLT, soit c'est dans le cadre d'un exercice de cours, soit c'est du masochisme.
    Pour mon cas précis, j'ai un pg qui extrait d'une base Oracle, via de multiples requêtes SQL, de grosses quantités de données ordonnées en thème dans un fichier XML qui sert d'archive et de trace d'exportation.
    À partir de fichier, en dynamique, j'utilise une seule feuille XSL (exportation de données d'un thème donné, reformatage, exclusion de données, ... : 10 lignes) pour créer n fichiers différents pour différentes entités qui ont des besoins propres. Il se trouve qu'une entité à besoin d'un fichier en CSV. D'où, dans mon pg, de cette "verrue".
    Quand je dois rajouter une fonction, j'essaye de la tester à part (test unitaire) avant de l'intégrer (test d'intégration) plutôt que de faire des essais avec le programme original qui nécessite un environnement particulier. Un problème à la fois.
    C'est ce "bout de code" que j'ai posté sur le Forum. Pas le "vrai" pg.
    J'espère t'avoir rassuré sur mon équilibre mental.
    Sinon, pour le reste, je m'occupe d'applications "métier" (progiciels, ETL, norme SEPA, Bureautique, applications graphiques, WebService, ...) et je retrouve de l'XML partout. Rebuté au premier abord par ces hiéroglyphes, je m'y suis plongé par curiosité et j'ai découvert sa puissance, ce qui m'a ouvert des possibilités énormes en terme de SI. Mais c'est vrai que je raisonne en tant que "Fonctionnel" et non plus qu'en tant de "Développeur" (même si j'aime toujours ça).
    Cordialement.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/06/2011, 12h14
  2. Réponses: 4
    Dernier message: 11/09/2008, 16h03
  3. Générer des noms de champs avec des tableaux
    Par MV1908 dans le forum Zend_Form
    Réponses: 2
    Dernier message: 26/05/2008, 16h16
  4. Pb export des noms de champ avec # ds EXCEL
    Par 31Steph dans le forum Access
    Réponses: 1
    Dernier message: 29/06/2006, 08h13
  5. [import] Excel et ligne de noms des champs
    Par babar01 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 15h46

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