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 :

Stylesheet pour copier un fichier XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 53
    Points
    53
    Par défaut Stylesheet pour copier un fichier XML
    Bonjour,

    Tout d'abord, le problème que j'énonce ci-dessous s'intègre dans un problème plus compliqué, donc ne vous demandez pas l'utilité de l'objectif (en réalité, le but est de créer, à partir d'un document xml contenant des balises d'inclusion de fichiers, le fichier résultant avec le contenu complet).

    Je souhaite avoir une feuille de style XSLT pour copier intégralement (sans les commentaires), et sans changement, un fichier xml (et donc produire le même fichier en sortie). Pour cela, j'ai la feuille suivante:

    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- on définit un espace de nom spécifique f2lt -->
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<!-- choisir method="xml" ou "html" suivant le type de sortie voulue -->
    	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1"
    		indent="yes" />
     
     
    	<xsl:template match="/">
    		<xsl:apply-templates select="*" />
    	</xsl:template>
     
     
    	<!-- Consommation des commentaires -->
    	<xsl:template match="comment()"></xsl:template>
     
    	<!-- on traite tous les noeuds récursivement -->
    	<xsl:template match="*">
    				<!-- on recopie la balise ouvrante -->
    				<xsl:copy>
    					<!-- on recopie tous les attributs -->
    					<xsl:apply-templates select="@*" />
    					<!-- on recopie le texte -->
    					<!--<xsl:value-of select="text()" />-->
    					<xsl:apply-templates select="text()"/>
    					<!-- on descend dans l'arbre -->
    					<xsl:apply-templates select="./*" />
    					<!-- on recopie la balise fermante -->
    				</xsl:copy>
    	</xsl:template>
     
     
    	<!-- on recopie un des attributs d'un noeud -->
    	<xsl:template match="@*">
    		<xsl:copy>
    			<xsl:apply-templates />
    		</xsl:copy>
    	</xsl:template>
     
     
    	<xsl:template match="text()">
    		<xsl:copy>
    			<xsl:apply-templates />
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>

    Le problème concerne les balises de type texte: dans mon fichier résultat, l'ordre de ces balises n'est pas conservé. Voici un exemple.

    Fichier en entrée (c'est du docbook):
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <section id="sec1">
    	<title id="t1">PERE</title>
    	<para>
    		J'ai ici un paragraphe
    		<emphasis>avec une emphase</emphasis>
    		puis la suite du para; et puis
    		<emphasis>une autre emphase ici</emphasis>
    		terminée par un point.
    	</para>
    	Puis un texte pour terminer...
     
    </section>
    Fichier produit:
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <section id="sec1">
     
     
    	Puis un texte pour terminer...
     
    <title id="t1">PERE</title>
       <para>
    		J'ai ici un paragraphe
     
    		puis la suite du para; et puis
     
    		terminée par un point.
    	<emphasis>avec une emphase</emphasis>
          <emphasis>une autre emphase ici</emphasis>
       </para>
    </section>
    Comme vous le voyez, le paragraphe est chamboulé!

    Est-ce que vous voyez le problème? Car j'ai passé des heures dessus hier mais je n'ai pas réussi à le résoudre... Merci d'avance pour votre précieuse aide.

  2. #2
    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,

    le problème vient du fait que tu fais un apply-templates pour les noeuds textuels, puis un apply-templates pour les balises filles, ce qui n'est pas forcément l'ordre dans lequel ces noeuds apparaissent dans le document ; c'est ce qui explique que tu te retrouves par exemple avec le texte 'Puis un texte pour terminer...' avant le reste du contenu de la section (des balises filles).

    Il faut que tu fasses un apply-templates qui traite tout le contenu d'un élément dans l'ordre dans lequel il apparaît dans le document, en utilisant l'opérateur "union" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:apply-templates select="*|text()" />
      </xsl:copy>
    </xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup ça marche très bien maintenant.

    Il me reste une dernière question: comment recopier dans le fichier résultat la déclaration de la DocType? (j'ai bien rajouté la ligne <!DOCTYPE ...> dans le pere)

    Car j'ai essayé avec
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:template match="DOCTYPE">
    <xsl:text>J'ai trouvé la doctype!!</xsl:text>
    <xsl:apply-templates select="/" />
    puis avec
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="!DOCTYPE">
    <xsl:text>J'ai trouvé la doctype!!</xsl:text>
    <xsl:apply-templates select="/" />
    mais ça ne marche pas (1: ne sélectionne rien ; 2: erreur à l'exécution, ne reconnaît pas le motif à cause du !)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    Ce n'est pas vraiment une réponse à ta question mais

    en réalité, le but est de créer, à partir d'un document xml contenant des balises d'inclusion de fichiers, le fichier résultant avec le contenu complet
    Ne te serai t-il pas plus simple de parser ton fichier xml avec un parseur XIncludeAware (je suppose içi que tu utilise XInclude) pour obtenir le fichier xml complet, puis de traité ce dernier avec par XSLT pour obtenir ta page xhtml ou autre.

    Exemple (en java/parseur DOM) :
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setXIncludeAware(true);
    dbf.setNamespaceAware(true);
    dbf.setFeature("http://apache.org/xml/features/xinclude/fixup-base-uris", false); //(pour empecher le parseur de rajouter le xml:base après XInclude)
    dbf.setFeature("http://apache.org/xml/features/xinclude/fixup-language", false); //(pour empecher le parseur de rajouter le xml:lang après XInclude)
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(xmlFile); //document xml complet

    Source xmlsource = new DOMSource(doc);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer(new StreamSource(xslfile)); //transforme ton xmlfile par ton xslfile
    transformer.transform(xmlsource, URLdesortie); //fichier xhtml dans l'URLdesortie

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Kahor Voir le message
    Ne te serai t-il pas plus simple de parser ton fichier xml avec un parseur XIncludeAware (je suppose içi que tu utilise XInclude) pour obtenir le fichier xml complet
    Ben si tout à fait mais je n'avais pas trouvé de processeur pour XInclude donc j'ai fait autrement. Et ça marche bien.

    Merci pour ton aide.

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 53
    Points
    53
    Par défaut
    comment recopier dans le fichier résultat la déclaration de la DocType?
    Au fait, pour info, j'ai trouvé comment insérer la doctype dans le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:output doctype-public="...">
    Voili voilou.
    Merci à tous.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/11/2006, 11h38
  2. [SimpleXML] Comment faire pour transformer un fichier XML en PHP ?
    Par magic8392 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 23/09/2005, 16h22
  3. Réponses: 5
    Dernier message: 25/07/2005, 10h17
  4. Batch pour copier des fichier
    Par borgfabr dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/03/2004, 07h55
  5. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29

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