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 :

[XSL 1.0] copie d'un noeud texte d'un document à un autre


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 26
    Points
    26
    Par défaut [XSL 1.0] copie d'un noeud texte d'un document à un autre
    Bonjour,
    Je débute dans ce language, mais après un rapide cours au Cnam sur XML et XSL, je me suis lancé dans une application qui doit créer un fichier XML avec les données d'un autre XML.
    Pourriez vous s'il vous plait m'orienter dans la bonne direction ? (sans me donner forcément le code tout prêt)

    En fait, je voudrais copier certains éléments XML d'un document 1 à un document 2 par une feuille de transformation XSL.

    EXPLICATION:
    Le document 1 est un fichier XML produit par une application externe (en C).
    Le document 2 est un modèle XML existant à utiliser.
    Le document 3 est le résultat XML attendu, un mélange du document 1 et du document 2.

    Il y a trois actions à réaliser.
    Pourriez-vous m'aider pour l'action 2 (copie des éléments)?

    ACTIONS :
    Action 1 - parcourir le document 1 et concaténer les éléments <Macro_typeSynth> et <nbLignes> pour le nom de fichier modèle comportant le document 2.

    Action 2 - copier le document 2 vers un nouveau document 3, en remplaçant les éléments <text> du document 2 par les éléments <textSynth> du

    document 1.

    Action 3 - nommer le fichier/document 3 par le noeud texte de l'élément <titreSequ> et l'extension .motn (en remplaçant les caractères

    spéciaux)


    EXEMPLE:
    Le document 1 est un fichier XML contenant les données à copier titreSequ> et <textSynth> (comme le fichier 06°06.mcr.xml)
    Le document 2 est un fichier XML modèle, contenant les élements <text> à remplacer (comme le fichier I3.xml)
    Le document 3 résultat est un fichier XML dont les éléments <text> ont leur texte remplacé par celui des éléments <textSynth> (comme "OM Verdict procès Courbis et Dreyfus.motn")

    Je travaille en PHP et DOM avec XSL 1.0
    je vous fournis les fichiers cités plus haut avec une page PHP et une feuille XSL capable d'afficher les occurences de fiches XML issues de l'application

    Merci de votre aide

    Frantz
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Je partirais sur une transformation XSLT 1.0 du document 2 avec le nom du document 1 en paramètre.

    Il suffit de repartir de la "fameuse" transformation identité en y rajoutant des priorités pour traiter le cas particulier.

    Sinon, c'est aussi faisable avec l'API DOM et XPath... et probablement plus rapide à l'exécution !
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 26
    Points
    26
    Par défaut ça avance un peu
    Avec tous les conseils des spécialistes sur Internet, j'ai trouvé une solution simple à mon problème mais partielle : Il suffit de recopier avec une feuille XSL et de remplacer les éléments avec une règle qui puise en Xpath dans le document externe, puis enregistre dans un fichier (c'est PHP qui s'en charge)

    Mais j'ai encore un problème (désolé) : comment imbriquer les deux boucles des occurences des éléments ciblés dans le document courant (le 2) et dans le document externe (le 1) ?

    Voici la feuille XSL de transformation
    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="iso-8859-1"?>
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
    <xsl:output method="xml" encoding="ISO-8859-1" indent="yes" doctype="ozxmlscene" />
     
    <!-- Copie du document 2 -->
    <xsl:template match="*|@*">
    	<xsl:copy>
    		<xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
    	</xsl:copy>
    </xsl:template>
     
    <!-- cas particulier de l'element <text> du document 2 -->
    <xsl:template match="/ozml/scene/layer/layer/scenenode/text">
    <!-- on definit un compteur d'occurences de <text> dans document 1 -->
    <xsl:variable name="n">0</xsl:variable>
    		<xsl:for-each select=".">
    			<xsl:element name="text"><xsl:copy-of select="document('xx-xx.mcr.xml')/SUJET/synthe/textSynth/text()" />
    			</xsl:element>
    		</xsl:for-each>
    	<xsl:apply-templates />	
    </xsl:template>
     
     
    </xsl:stylesheet>
    et le fichier PHP
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//FR" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> 
    <title>LisaMotion 2009)</title></head>
     
    <!-- couleur de fond bleu clair -->
    <body bgcolor="#BECEEA">
     
    <font size="3" face="Arial" color="black">
     
    <?php
    $dateFormat="j/m/Y H:i:s";
     
    /// ---- PARSING ---------------- ///
     
    //adresse du repertoire
    $cheminDossier = "./";
     
    //fichier par defaut
    $fichierDefault = "I3.xml";
     
     
    // --- choix du tri ----------
    $order=SORT_ASC;
    $nextOrder=1;
     
    if(isset($_GET['order']))
    	{ 
    	if($_GET['order']==1)
    		{
    		$order=SORT_DESC;
    		$nextOrder=0;
    		}
    	}
    ?>
     
    <!--  Initialisation par defaut -->
     
    <?php
    if(isset($_GET['file'])) 
    {
    	$fichierLisaXML=$_GET['file'];
    }
    else 
    {
    	$fichierLisaXML=$fichierDefault;
    }
    // Initalisation du chemin du fichier avec le chemin du dossier
    $cheminFichier=$cheminDossier;
    // Concatenation avec le nom du fichier (avec .=)
    $cheminFichier.=$fichierLisaXML;
    // affectation de ce chemin dans la variable FichierLisaXML
    $fichierLisaXML=$cheminFichier;
     
     
    ?>
     
    <!-- Traitement de la valeur passee en parametre -->
     
    <!-- Affichage de la feuille SHTML transformee a partir du XML et des XSL-->
    <?php
    //J'instancie un nouveau document DOM
    $xml = new DOMDocument();
    
    // Je lui charge le fichier XML choisi 
    
    $xml->load($fichierLisaXML);
     
    // Je charge le fichier XSL d'affichage et de transformation :
    // J'affecte le nom du fichier XSL dans une variable
    $xsl_file = 'LisaMotion.xsl';
     
    //J'instancie un nouveau document DOM
    $xsl = new DOMDocument();
     
    // Je lui charge le fichier XSL
    $xsl->load($xsl_file);
     
    //J'instancie le processeur de transformation XSLT
    $proc = new XSLTProcessor();
     
    //je lui passe la feuille XSL de transformation recuperee ci-dessus
    $proc->ImportStyleSheet($xsl);
     
    // je lance la transformation XSLT et sauvegarde le resultat
     
    $newDoc=$proc->transformToDoc($xml);
    $newDoc->save("test-transform.motn");
     
    ?>
    <br/>
    </font>
    </body>
    </html>
    Merci de votre aide, car pour l'instant je recopie toutes les occurrences de l'élément <text> du document 1 dans toutes les occurrences de l'élément <text> de l'élément 2 !
    (je n'arrive pas à utiliser le compteur).

    Frantz

Discussions similaires

  1. [WD-2007] Copie stricte d'une page d'un document à un autre
    Par Chino18 dans le forum VBA Word
    Réponses: 8
    Dernier message: 14/09/2010, 16h00
  2. [XSL] Eliminer les doublons dans un noeud
    Par Shadow aok dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/04/2006, 15h17
  3. [XSL] problème avec copy espace de nom
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 15h18
  4. [XSL][XHTML] test sur position de noeuds (text() et autres)
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/09/2005, 17h47
  5. XSL ne parvient pas à lire les noeuds XML ??
    Par yahn dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2004, 19h29

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