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 :

[XSLT]Utilisation de la librairie redirect


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 [XSLT]Utilisation de la librairie redirect
    Bonjour,

    Rappel du contexte (pour ceux qui m'auraient pas croisé récemment). J'ai un document docbook que je souhaite exploiter grâce aux filtres XML d'OpenOffice.org writer. A l'ouverture de ce document dans l'éditeur de texte, une feuille de style XSLT parcourant mon fichier docbook est appelée et le document est correctement présenté.

    Voici mon problème.
    En plus de transformer mon fichier docbook en document OpenOffice, je souhaiterais que ma feuille de style écrive dans un fichier externe. En particulier, lorsqu'on passe dans un élément citation. J'ai lu dans la FAQ XSLT que c'était possible grâce à la librairie redirect d'Apache. Après avoir regardé comment ça fonctionnait exactement, j'ai rédigé les bouts de code suivants:

    Dans ma feuille de style XSLT:
    -> en-tête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            ...
    	xmlns:redirect="http://xml.apache.org/xalan/redirect">
    -> motif citation:
    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
    	<xsl:template match="citation">
    		<!-- Traitement qu'il faut pour produire le résultat -->
     
    		<xsl:variable name="cheminCitations"
    			select="'../references_externes/citations.xml'" />
    		<xsl:choose>
    			<xsl:when test="document($cheminCitations)">
    				<redirect:write file="'{$cheminCitations}'"
    					append="true">
    					<section />
    				</redirect:write>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:call-template name="AfficherMessage">
    					<xsl:with-param name="message">
    						Fichier pas trouvé!
    					</xsl:with-param>
    					<xsl:with-param name="spanSeulement">
    						true
    					</xsl:with-param>
    				</xsl:call-template>
    			</xsl:otherwise>
    		</xsl:choose>
     
    	</xsl:template>
    Le document citations.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?xml version="1.0" encoding="UTF-8"?>
    Mais voilà, alors que le document est bien trouvé puisqu'il n'y a pas de message d'erreur à s'afficher dans le document produit, la feuille de style n'écrit rien dans le document citations.

    D'autre part,
    • L'éditeur Eclipse, dans lequel je rédige mes documents ne déclenche pas d'erreur, mais n'a pas l'air de connaître la grammaire du tag <redirect:write> car lorsque j'entre un nom aberrant d'attribut, il n'y a aucune erreur de déclenchée (alors que le même attribut dans <xsl:variable> par exemple déclenche une erreur)
    • Eclipse ne peut pas se connecter à internet à cause d'un proxy (pour aller chercher les DTD sur internet notament)


    D'où les questions suivantes:
    • Comment être sûr que l'instruction <redirect:write ...> est bien comprise par le processeur?
    • Est-ce que le processeur utilisé par OpenOffice pour exécuter la transformation gère cette librairie?



    Si vous voyez l'erreur, n'hésitez pas à m'aider... Merci.

  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,
    Il faut quand même indiquer au processeur que redirect est un préfixe permettant d'invoquer une de ses extensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:stylesheet
    ...
    extension-element-prefixes="redirect"/>
    Tu as un autre problème avec ce test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="document($cheminCitations)">
    Avant d'écrire dans le fichier, tu testes s'il n'est pas vide (document() renvoie la racine du document XML passé en paramètre) ; or, s'il l'est, l'écriture ne se fait pas et ne se fera donc jamais puisque le test sera toujours négatif... Tu ne peux pas te servir de document() pour cet usage. D'autre part, je ne suis pas certain que les apostrophes soient nécessaires dans l'attribut file de redirect. Pour le bon usage de redirect : http://xml.apache.org/xalan-j/extens....html#redirect
    Citation Envoyé par samalairbien Voir le message
    Comment être sûr que l'instruction <redirect:write ...> est bien comprise par le processeur?
    Elle l'est forcément, sinon elle ne serait pas interprétée comme telle et tu la retrouverais reproduite littéralement dans le document de sortie, ou bien une erreur serait déclenchée par le processeur.
    Citation Envoyé par samalairbien Voir le message
    [*]Est-ce que le processeur utilisé par OpenOffice pour exécuter la transformation gère cette librairie?
    Tout à fait, le filtre XML de OOo utilise Xalan (version 2.7 il me semble) à qui appartient cette extension de XSLT, comme l'indique d'ailleurs l'espace de noms désigné par redirect (http://xml.apache.org/xalan/redirect).

  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 pour ton aide GrandFather. Maintenant, j'arrive bien à écrire dans le fichier extérieur. Le code de ma feuille de style est maintenant le suivant (après correction):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:template match="citation"> <!-- Plusieurs citations par documents -->
    <!-- ... -->
    			<redirect:write select="$cheminCitations" append="true">
    				<section role="{$composant}">
    					<para role="{$refEval}" id="{$version}" />
    				</section>
    			</redirect:write>
    <!-- ... -->
    </xsl:template>
    Fichier citations.xml 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
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <section xmlns:f2lt="urn:f2lt"
    	xmlns:ooo="http://openoffice.org/2004/office"
    	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
    	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
    	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
    	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
    	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
    	xmlns:xlink="http://www.w3.org/1999/xlink"
    	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    	role="ASE_REQ.1">
    	<para id="3.0" role="ST" />
    </section>
    <?xml version="1.0" encoding="UTF-8"?>
    <section xmlns:f2lt="urn:f2lt"
    	xmlns:ooo="http://openoffice.org/2004/office"
    	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
    	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
    	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
    	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
    	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
    	xmlns:xlink="http://www.w3.org/1999/xlink"
    	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    	role="ASE_REQ.1">
    	<para id="6.0" role="ST" />
    </section>
    <?xml version="1.0" encoding="UTF-8"?>
    <section xmlns:f2lt="urn:f2lt"
    	xmlns:ooo="http://openoffice.org/2004/office"
    	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
    	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
    	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
    	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
    	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
    	xmlns:xlink="http://www.w3.org/1999/xlink"
    	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    	role="ASE_REQ.2">
    	<para id="3.0" role="ST" />
    </section>
    Cependant, quelques questions subsistent. Car le résultat que j'aimerais produire ressemble à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8"?>
    <article>
    	<section role="ASE_REQ.1">
    		<para id="3.0" role="ST" />
    		<para id="6.0" role="ST" />
    	</section>
    	<section role="ASE_REQ.2">
    		<para id="3.0" role="ST" />
    	</section>
    </article>
    D'où mes questions:
    • Est-ce qu'il y a un moyen pour ne pas écrire <?xml version="1.0" encoding="UTF-8"?> à chaque début d'écriture?
    • Le but étant de regrouper les citations pour un même composant, est-il possible de stipuler dans la balise redirect:write l'endroit où je veux écrire dans le fichier?


    Merci.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Dans ta feuille originale essaie d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    exclude-result-prefixes="ooo text"
    avec toutes tes extensions inutiles.
    Je crois que c'est espace le séparateur.

  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 Morbo Voir le message
    Dans ta feuille originale essaie d'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    exclude-result-prefixes="ooo text"
    Malheureusement, ça ne change pas le fichier "citations.xml" produit (toujours les <?xml version="1.0" encoding="UTF-8"?> à chaque écriture et pas d'élément racine). Qu'est-ce qu'était sensée faire cette ligne?

  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
    Citation Envoyé par samalairbien Voir le message
    D'où mes questions:
    • Est-ce qu'il y a un moyen pour ne pas écrire <?xml version="1.0" encoding="UTF-8"?> à chaque début d'écriture?
    • Le but étant de regrouper les citations pour un même composant, est-il possible de stipuler dans la balise redirect:write l'endroit où je veux écrire dans le fichier?

    Le premier point vient d'être résolu. En fait, il fallait utiliser les balises <redirect:open> et <redirect:close>. En effet, chaque instruction write ouvre, écrit et ferme le document. C'est l'ouverture qui provoque l'insertion de <?xml version="1.0" encoding="UTF-8"?>. J'ai donc mis, dans le template d'élément racine de ma feuille xslt le code suivant:

    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
     
    			<!-- CORPS DU DOCUMENT -->
    			<office:body>
    				<office:text>
    					<redirect:open select="$cheminCitations" />
    					<!-- 					<redirect:write select="$cheminCitations">
    						<section>
    						</redirect:write>
    					-->
    					<xsl:apply-templates>
    						<xsl:with-param name="level" select="0" />
    					</xsl:apply-templates>
     
    					<!-- 					<redirect:write select="$cheminCitations">
    						</section>
    						</redirect:write>
    					-->
    					<redirect:close select="$cheminCitations" />
    				</office:text>
    			</office:body>
    		</office:document>
    Ainsi, le document n'est ouvert qu'une seule fois. Voici donc une partie du fichier citations.xml 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?xml version="1.0" encoding="UTF-8"?>
    <section xmlns:f2lt="urn:f2lt"
    	xmlns:ooo="http://openoffice.org/2004/office"
    	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    	xmlns:xlink="http://www.w3.org/1999/xlink"
    	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    	role="ASE_REQ.1">
    	<para id="3.0" role="ST" />
    </section>
    <section xmlns:f2lt="urn:f2lt"
    	xmlns:ooo="http://openoffice.org/2004/office"
    	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    	xmlns:xlink="http://www.w3.org/1999/xlink"
    	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    	role="ASE_REQ.1">
    	<para id="3.0" role="ST" />
    </section>
    <section xmlns:f2lt="urn:f2lt"
    	xmlns:ooo="http://openoffice.org/2004/office"
    	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    	xmlns:xlink="http://www.w3.org/1999/xlink"
    	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    	role="ASE_REQ.1">
    	<para id="4.0" role="ST" />
    </section>
    Cependant, il reste le problème que ce fichier n'a pas d'élément racine: je ne peux donc pas le parcourir et le lire.
    L'idée est d'insérer le tag <section> (ou <article>) à l'ouverture et le tag </section> (ou </article>) avant la fermeture (-> cf commentaires dans première partie du code). Mais je n'y arrive pas car <section> est interprété comme une balise de ma feuille de style et doit être fermée correctement. J'ai également essayé:
    - avec les caractères < et > au lieu de < et > mais ils apparaissent tel que dans le fichier citations.xml.
    - avec un <xsl:value-of select="<section>"> mais les caractères < et > ne sont pas permis dans cette construction
    - avec du coup <xsl:value-of select="<section>" /> mais une erreur me dit qu'on ne peut pas insérer de noeuds dans XPath, seulement avec XQuery

    Est-ce que quelqu'un a une idée pour insérer l'élément racine? J'espère que oui, car je suis proche du but... Merci.

  7. #7
    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 samalairbien Voir le message
    Est-ce que quelqu'un a une idée pour insérer l'élément racine? J'espère que oui, car je suis proche du but... Merci.
    Problème résolu: il suffisait tout simplement de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <redirect:write>
    <section>
    <xsl:apply-templates />
    </section>
    </redirect:write>
    dans le motif de l'élément racine.

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

Discussions similaires

  1. [XSLT] Utilisation variable template
    Par mihaestii dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 23/11/2005, 15h44
  2. [XSLT] Utilisation de XML avec PHP dans le cadre d'un site
    Par nicolas66 dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 06/11/2005, 22h39
  3. Réponses: 4
    Dernier message: 13/10/2005, 12h41
  4. [Débutant] utilisation de la librairie windows
    Par tavman dans le forum Windows
    Réponses: 12
    Dernier message: 27/08/2005, 16h21
  5. Utilisation de la librairie ng sous FreeBSD
    Par Mercenary Developer dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 07/12/2004, 09h39

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