1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2017
    Messages : 14
    Points : 8
    Points
    8

    Par défaut Transformer un fichier XML avec XSLT pour insérer les données dans une base de données

    Bonjour à tous,

    J'ai écrit un code XSLT afin de créer des requêtes SQL permettant de sélectionner les données du fichier que je veux insérer dans une base de données.

    Cela fonctionne très bien mais j'ai toutefois un petit problème que je n'arrive pas à régler, certainement à cause de mon chemin XPath mais je ne vois pas où.

    En effet, je souhaite récupérer les informations présentes dans tous les éléments <forme_ancienne> présents dans les articles (lorsque cet élément est présent). Le problème, c'est qu'avec mon code je n'obtiens que les informations du premier élément <forme_ancienne>, et pas les suivantes...

    Voyez-vous ce qui ne va pas dans mon code ?

    Extrait du fichier XML :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE DICTIONNAIRE SYSTEM "TOPOGR.DTD">
     
    <DICTIONNAIRE departement="Aisne" dep="02">
     
    <article id="10" pg="1">
    <vedette><sm>Abbeville,</sm></vedette>
    <definition><typologie>ferme</typologie>, <localisation>commune de Fontaine-Notre-Dame</localisation>.</definition>
    <forme_ancienne><i>Abbatis villa,</i> <date>1124</date> <reference>(cart. d’Homblières, p.*6)</reference>.</forme_ancienne>
    <forme_ancienne><i>Abeville,</i> <date>1309</date> <reference>(cart. AA de l’abb. de Saint-Quentin-en-l’Île, p.*308)</reference>.</forme_ancienne>
    <commentaire><p>Cette ferme, qui appartenait autrefois à l’abbaye d’Homblières, est détruite.</p></commentaire>
    </article>
     
    <article id="11" pg="1">
    <vedette><sm>Abbiette (L’),</sm></vedette>
    <definition><typologie>petit hameau</typologie>, <localisation>commune de Gauchy</localisation>.</definition>
    <forme_ancienne>— Villa que dicitur <i>Vetus-Villa</i> prope Sanctum-Quintinum, <date>1216</date>*;</forme_ancienne>
    <forme_ancienne><i>Vieville,</i> <date>1313</date> <reference>(cart. AB de l’abb. de Saint-Quentin-en-l’Île, p.*136 et 138)</reference>.</forme_ancienne>
    <forme_ancienne>— Terroir de <i>Viesville,</i> <date>1313</date> <reference>(cart. de l’abb. de Saint-Quentin-en-l’Île, arch. de l’Emp. LL 1016)</reference>.</forme_ancienne>
    <forme_ancienne><i>Viefville-emprès-Saint-Quentin, Vielzville-dales-Saint-Quentin,</i> <date>1384</date> <pg>2</pg><reference>(transcrits de Vermandois, P. 135, f°*255, arch. de l’Emp.)</reference>.</forme_ancienne>
    <forme_ancienne><i>Viefville lez-Saint-Quentin,</i> <date>1610</date>*;</forme_ancienne>
    <forme_ancienne><i>Labiette,</i> <date>1624</date> <reference>(titres de l’abb. de Saint-Quentin-en-l’Île)</reference>.</forme_ancienne>
    <forme_ancienne><i>Abiette</i> <reference>(carte de Cassini)</reference>.</forme_ancienne>
    <commentaire><p>Domaine de l’abb. de Saint-Quentin-en-l’Île, relevant autrefois de Gauchy.</p></commentaire>
    </article>
     
    <article id="12" pg="2">
    <vedette><sm>Abia,</sm></vedette>
    <definition><typologie>maison isolée</typologie>, <localisation>commune de Chevregny</localisation>.</definition>
    </article>
     
    </DICTIONNAIRE>
    Code XSLT :

    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
        <xsl:output method="text"/>
     
        <xsl:template match="/">
            <xsl:apply-templates select="//article"/>
        </xsl:template>
     
        <xsl:template match="article">
            <xsl:if test="not(contains(article, forme_ancienne))">
                <xsl:text>insert into formesanciennes (id_vedette, dep, forme_ancienne, forme_ancienne_entiere, date_fa, reference_forme_ancienne, renvoi, rech_fa, recherche, rech_ref_fa, rech_date, rech_periode) values('</xsl:text>
                <xsl:value-of select="./@id"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="../@dep"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/i"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/date"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/reference"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/renvoi"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/i"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/reference"/>
                <xsl:text>','</xsl:text>
                <xsl:value-of select="./forme_ancienne/date"/>
                <xsl:text>','');&#xA;</xsl:text>
            </xsl:if>
        </xsl:template>
     
    </xsl:stylesheet>
    Merci d'avance pour votre aide !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 202
    Points : 18 959
    Points
    18 959

    Par défaut

    Hello,

    a priori tu as besoin d'un insert pour chaque <forme_ancienne>, donc tu vas devoir faire une boucle dessus, avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="forme_ancienne">
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2017
    Messages : 14
    Points : 8
    Points
    8

    Par défaut

    Merci pour votre réponse !

    J'avais déjà essayé avec un for-each mais ça ne fonctionne pas. Quand je l'ajoute, je n'ai plus rien du tout en sortie...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 202
    Points : 18 959
    Points
    18 959

    Par défaut

    'Faudrait que tu parles un peu plus.

    J'ai dit des trucs du genre "si tu as plusieurs <forme_ancienne> je suppose que tu dois faire plusieurs insert." C'est oui ou c'est non ?

    S'il faut un insert par <forme_ancienne>, alors une manière de le faire est une boucle, et une boucle c'est un for-each. Si tu as déjà essayé mais que ça ne marchait pas, il faut montrer ton code pour qu'on t'aide à le corriger.

    C'est pas en tapant trois mots de temps en temps qu'on avance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2017
    Messages : 14
    Points : 8
    Points
    8

    Par défaut

    Je n'avais pas compris que vous posiez une question mais oui il faut un insert par forme ancienne.

    Voilà le code que j'avais essayé avec <for-each> :

    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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
        <xsl:output method="text"/>
     
        <xsl:template match="/">
            <xsl:apply-templates select="//article"/>
        </xsl:template>
     
        <xsl:template match="article">
            <xsl:if test="not(contains(article, forme_ancienne))">
                <xsl:for-each select="forme_ancienne">
                   <xsl:text>insert into formesanciennes (id_vedette, dep, forme_ancienne, forme_ancienne_entiere, date_fa, reference_forme_ancienne, renvoi, rech_fa, recherche, rech_ref_fa, rech_date, rech_periode) values('</xsl:text>
                   <xsl:value-of select="./@id"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="../@dep"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/i"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/date"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/reference"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/renvoi"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/i"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/reference"/>
                   <xsl:text>','</xsl:text>
                   <xsl:value-of select="./forme_ancienne/date"/>
                   <xsl:text>','');&#xA;</xsl:text>
                </xsl:for-each>
            </xsl:if>
     
        </xsl:template>
     
    </xsl:stylesheet>

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 202
    Points : 18 959
    Points
    18 959

    Par défaut

    Effectivement, quand tu fais un for-each sur <forme_ancienne>, alors <forme_ancienne> devient l'élément en cours.

    Et du coup il ne faut plus aller chercher les infos dans select="forme_ancienne/i" mais simplement select="i" puisque <i> est l'enfant direct.

    Pour récupérer l'attribut @id du <article> parent, tu peux faire select="../@id"

    Même chose pour @dep, select="../../@dep" ou bien select="/DICTIONNAIRE/@dep" parce que de toute façon il est global et ça devient compliqué de remonter de deux crans.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juillet 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2017
    Messages : 14
    Points : 8
    Points
    8

    Par défaut

    Aaah d'accord merci beaucoup !!
    Et merci pour vos explications !
    Bonne fin de journée !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/03/2017, 10h54
  2. Réponses: 1
    Dernier message: 06/12/2011, 21h08
  3. Réponses: 2
    Dernier message: 09/04/2007, 21h52
  4. insérer des tables dans une base de données oracle
    Par Spacy_green dans le forum Oracle
    Réponses: 3
    Dernier message: 16/03/2007, 11h23
  5. insérer des élément dans une base de donné
    Par wiss20000 dans le forum JDBC
    Réponses: 5
    Dernier message: 01/03/2007, 14h49

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