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 :

Problème de chemin relatif contenu dans un XML appelé par la commande ENTITY


Sujet :

XML/XSL et SOAP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2
    Par défaut Problème de chemin relatif contenu dans un XML appelé par la commande ENTITY
    Bonjour,

    Je vous expose mon problème pour lequel, malgré mes recherches sur le web, je n'ai pas trouvé de solution. Je ne sais d'ailleurs pas s'il en existe une.

    J'ai fait un exemple simple qui reproduit mon problème. L'arborescence de mes fichiers est la suivante:

    E:\temp\Validations\validation.xml
    E:\temp\Validations\images\toto.jpg
    E:\temp\xsl\Validation.xsl
    E:\temp\xsl\MasterXSL.xsl
    E:\temp\MasterXML.xml

    Le fichier validation.xml contient une balise avec le chemin relatif vers une image:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="E:\temp\xsl\validation.xsl"?>
    <modale>
    	<mode id="1">
    		<Picture>.\images\toto.jpg</Picture>
    	</mode>
    </modale>
    Le fichier de mise en forme validation.xsl contient le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="modale">
    	<xsl:for-each select="mode[attribute::id mod 2 = 1]">
    		<a href="{Picture}"><img border="0" src="{Picture}" width="400"/></a>
    	</xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    Lorsque j'ouvre le fichier validation.xml, l'image s'affiche correctement.

    J'ai maintenant un fichier MasterXML.xml qui fait appel à validation.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="E:\temp\xsl\MasterXSL.xsl"?>
    <!DOCTYPE Validations [
    <!ENTITY Phys_enc_lib SYSTEM "Validations\validation.xml">
    ]>
    <Validations>
    &Phys_enc_lib;
    </Validations>
    Le fichier MasterXSL.xsl contenant quant à lui le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="validation.xsl"/>
        <xsl:template match="/">
            <html>
            <head>
            </head>
            <body>
                <xsl:apply-imports/>
            </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>
    Le problème est que lorsque j'ouvre le fichier MasterXML.xml, le chemin relatif vers l'image est mal interprété puisqu'il cherche le fichier E:/temp/images/toto.jpg qui n'existe pas.

    Ma question est alors la suivante: comment faire en sorte que le chemin relatif de l'image soit bien interprété dans le MasterXML? (la solution de passer en chemin absolu pour pointer vers l'image ne me convient pas, ni celle d'avoir mes 2 fichiers XML au même niveau d'arborescence). Je suis plutôt novice en XML, c'est pourquoi je sollicite votre aide.

    Merci par avance

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Les URL et les "chemins" Windows sont deux choses totalement différentes.

    Une URL est composée d'un protocole (http://, ftp://, file:// (ou file:/// selon le système), ...) et d'un chemin absolu dont le séparateur de répertoire est un "/".
    Elle peut aussi être composée d'un chemin relatif vers un fichier, où le séparateur de répertoire est un "/". Auquel cas, le protocole ne doit pas être précisé.

    Donc "E:\temp\xsl\validation.xsl" n'est pas une URL valide par exemple. Une URL valide serait "file:///E/temp/xsl/validation.xsl" ou bien "xsl/validation.xsl".

    Voilà pour ce qui est des URLs déjà.

    Maintenant pour ce qui est de leur utilisation active dans les XML/XSL c'est un peu plus complexe.

    La première chose à savoir c'est que les XSL n'ont aucune notion de leur emplacement physique sur le disque. Toute notion de relativité dans un XSL dépend uniquement de l'emplacement de l'appelant.

    Exemple :
    1. E:\temp\xsl\MasterXSL.xsl
    2. E:\temp\MasterXML.xml


    MasterXML.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="xsl/MasterXSL.xsl"?>
    <Validation/>
    MasterXSL.xsl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="xsl/validation.xsl"/>
        <xsl:template match="/">
        </xsl:template>
    </xsl:stylesheet>
    Dans ton cas, je peux te proposer une solution alternative qui fonctionne, sans passer par les entités :

    Arborescence :
    1. chargeur.xml
    2. xsl/chargeur.xsl
    3. images/images.xml
    4. images/image.png


    Contenu des fichiers :
    chargeur.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="xsl/chargeur.xsl"?>
     
    <charger>images/images.xml</charger>
    images/images.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0"?>
     
    <images>
    	<image>image.png</image>
    </images>
    et enfin, xsl/chargeur.xsl :
    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
    <?xml version="1.0"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:template match="/">
    	<html>
    		<xsl:variable name="path">
    			<xsl:call-template name="get_path">
    				<xsl:with-param name="remaining" select="charger"/>
    			</xsl:call-template>
    		</xsl:variable>
    		Image : <img src="{concat($path, document(charger)/images/image)}"/>
    	</html>
    	</xsl:template>
     
    	<xsl:template name="get_path">
    		<xsl:param name="before" select='' />
    		<xsl:param name="remaining" />
    		<xsl:choose>
    			<xsl:when test="contains($remaining, '/')">
    				<xsl:call-template name="get_path">
    					<xsl:with-param name="before" select="concat($before, substring-before($remaining, '/'), '/')"/>
    					<xsl:with-param name="remaining" select="substring-after($remaining, '/')"/>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$before"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    Par contre je t'avoue qu'avec les entités je ne sais pas (avec Firefox ça marche pas donc je peux pas tester).
    A priori il suffit de mettre le chemin relatif par rapport au fichier appellant, soit :<Picture>Validations/images/toto.jpg</Picture>.

    Une autre solution est de spécifier le path à ajouter aux URL (comme je l'ai fait moi dans mon XSL, mais de façon plus statique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="E:\temp\xsl\MasterXSL.xsl"?>
    <!DOCTYPE Validations [
    <!ENTITY Phys_enc_lib SYSTEM "Validations\validation.xml">
    ]>
    <Validations path="Validations">&Phys_enc_lib;</Validations>
     
    <!-- et le xsl -->
    <xsl:template match="/Validations">
      <img src="{concat(@path, '/', val/modale/mode/Picture}"/>
    </xsl:template>

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2
    Par défaut
    Merci pour la réponse.

    A vrai dire je n'ai pas testé cette solution, j'ai trouvé une façon de faire, qui n'est peut-etre pas optimale mais qui marche:
    - Dans mon fichier validation.xml je rajoute 2 champs, un <localpath> et un <masterpath>. Le xml est mis en forme par un XSL qui récupère dans une variable le <localpath>, que j 'utilise pour faire mon href par concaténation.
    - Dans le MasterXSL, je fais appel à un MasterValidation.xsl qui récupère le <masterpath> et non le <localpath>

    Cela m'oblige à avoir un XSL supplémentaire, mais cela marche et ça répond à mon besoin.

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

Discussions similaires

  1. recuperer le chemin d'un fichier contenu dans mon xml
    Par kaking dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 18/07/2012, 07h53
  2. Réponses: 13
    Dernier message: 21/01/2010, 13h55
  3. [Picturebox] Problème de chemin relatif ?
    Par Invité dans le forum VB.NET
    Réponses: 2
    Dernier message: 08/04/2007, 14h48
  4. Réponses: 35
    Dernier message: 21/05/2006, 21h01
  5. [JSP] Include, problème de chemin relatif
    Par dafly dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/04/2004, 14h11

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