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 2.0] Namespace ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut [XSLT 2.0] Namespace ?
    Bonjour, j'ai un probleme avec XSLT.
    J'utilise XSLT 2, avec un moteur Saxon He 9.2.0.3

    Qd je rentre un fichier xml comme celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <uidl xmlns="http://mon_adresse/schema/v2/window.xsd"
    	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://mon_adresse/schema/v2
                              http://mon_adresse/schema/v2/window.xsd">
     
    	<translations>
    	   <!-- des trucs -->	
    	</translations>
    	<window>
    	   <!-- d'autres trucs -->	
    	</window>
    </uidl>
    ma feuille xslt ne rend pas de sortie alors que si j'utilise
    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="UTF-8"?>
    <uidl>
     
    	<translations>
    	   <!-- des trucs -->	
    	</translations>
    	<window>
    	   <!-- d'autres trucs -->	
    	</window>
    </uidl>
    j'ai le rendu désiré.. Je vois pas en quoi mes déclarations xmlns viennent empecher xslt de fonctionner...

    Des idées?

    Merci bcp...

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Oui mais tu ne vas pas aimer.

    Dans le XSLT, quand tu lui demandes un traitement sur l'élément "translations" sans namespace, lui tout ce qu'il voit c'est l'élément "translations" du namespace "http://mon_adresse/schema/v2/window.xsd". Pas la même chose du tout, donc la règle ne s'applique pas.

    Donc, ce qu'il faut faire, dans la XSL, c'est déclarer le namespace "http://mon_adresse/schema/v2/window.xsd" avec un préfixe, par exemple w:

    Ensuite, utiliser ce préfixe dans tes expressions xPath et des match :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <template match="w:translations">
      Ta transformation...
    </template>
    Attention, j'ai bien dit d'utiliser un préfixe. Il n'y a pas de namespace par défaut dans xPath.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Merci pour la réponse,

    J'ai tout de même un peu de mal avec ce truc la..
    Imaginons le XSL 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
    22
    23
    24
    25
    26
    27
    28
    29
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<!-- Match root of document -->
    	<xsl:template match="/">
     
    		<!-- Create one document by translation, so iterates on translation -->
    		<xsl:for-each select="//translations/*">
     
    			<xsl:result-document href="{@output}">
    				<xsl:variable name="ref">http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd</xsl:variable>
     
    				<beans>
     
    					<xsl:attribute name="xsi:schemaLocation"><xsl:value-of select="$ref"/></xsl:attribute>
    					<!-- Root element can be either window, moduleBar or module -->
    					<!-- Search window, with name of translation as parameter  -->
    					<xsl:apply-templates select="/uidl/window">
    						<xsl:with-param name="doc" select="."/>
    					</xsl:apply-templates>
     
    				</beans>
    			</xsl:result-document>
    		</xsl:for-each>
    	</xsl:template>
    <xsl:template match="window">
    <!-- Des trucs... -->
    qu'est ce qu'il faut que je fasse? Je dois rajouter dans <xsl:stylesheet> un xmlns:w="http://mon_adresse machin" ? et pour l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//translations/*">
    comment est ce que je dois me débrouiller?

    Merci de m'éclairer.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par ama_deo Voir le message
    qu'est ce qu'il faut que je fasse? Je dois rajouter dans <xsl:stylesheet> un xmlns:w="http://mon_adresse machin" ?
    C'est ce que j'ai dit, oui.

    Citation Envoyé par ama_deo Voir le message
    et pour l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//translations/*">
    comment est ce que je dois me débrouiller?

    Citation Envoyé par thelvin
    Ensuite, utiliser ce préfixe dans tes expressions xPath et tes match :
    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//w:translations/*">

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Merci bcp, j'ai compris..

    Pour la racine j'ai ceci :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
    	xmlns:uidl="http://mon_adresse/schema/v2/window.xsd"
    	xmlns:def="http://mon_adresse/schema/v2/translation.xsd">
     
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<!-- Match root of document -->
    	<xsl:template match="/">
     
    		<!-- Create one document by translation, so iterates on translation -->
    		<xsl:for-each select="//uidl:translations/*">
     
    			<xsl:result-document href="{@output}">
    				<xsl:variable name="ref">http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd</xsl:variable>
     
    				<beans>
     
    					<xsl:attribute name="xsi:schemaLocation"><xsl:value-of select="$ref"/></xsl:attribute>
    						<xsl:apply-templates select="/uidl:uidl/uidl:window">
    						<xsl:with-param name="doc" select="."/>
    					</xsl:apply-templates>
    				</beans>
    			</xsl:result-document>
    		</xsl:for-each>
    	</xsl:template>
    Alors, il y a deux choses :

    -je crée un élément beans, root du document de sortie. Mais apres avoir rajouté xmlns:uidl="mon adresse" dans le <xsl:stylesheet>, et bien dans la sortie, je retrouve ce xmlns:uidl="mon adresse" dans mon élément <beans>, ce que je ne veux pas..

    -je souhaite effectivement mettre d'autre élément xmlns:préfixe="qqch" dans mon élément <beans> de sortie et le seul moyen que j'ai trouvé est de placer ces éléments xmlns dans <xsl:stylesheet> pcq il n'y a pas moyen d'ajouter des attributs xmlns avec <xsl:attribute>. Y a t-il une solution plus propre?

    Merci bcp pour tes réponses.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par ama_deo Voir le message
    -je crée un élément beans, root du document de sortie. Mais apres avoir rajouté xmlns:uidl="mon adresse" dans le <xsl:stylesheet>, et bien dans la sortie, je retrouve ce xmlns:uidl="mon adresse" dans mon élément <beans>, ce que je ne veux pas..
    Oh... Euh, en effet, je n'ai jamais eu ce besoin.

    Je pense que l'attribut exclude-result-prefixes est fait pour ça, mais je vais vérifier.

    Citation Envoyé par ama_deo Voir le message
    -je souhaite effectivement mettre d'autre élément xmlns:préfixe="qqch" dans mon élément <beans> de sortie et le seul moyen que j'ai trouvé est de placer ces éléments xmlns dans <xsl:stylesheet> pcq il n'y a pas moyen d'ajouter des attributs xmlns avec <xsl:attribute>. Y a t-il une solution plus propre?
    À ma connaissance, c'est comme ça qu'on fait.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Nickel,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exclude-result-prefixes="uidl def"
    permet bien de ne pas inclure xmlns:uidl="blabla" et xmlns:def="blabla" dans la sortie.

    Tout est maintenant réglé.

    Merci beaucoup pour ton aide.

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

Discussions similaires

  1. [XSLT] pb avec namespace
    Par GDMINFO dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 28/06/2007, 11h47
  2. [XSLT]Problème de namespace sur un export XMi (UML 2.1/XMi 2.1)
    Par CocoRambo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/06/2007, 09h50
  3. [XSLT]Transformation et namespace
    Par Koyote dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 02/02/2007, 11h39
  4. [XSLT] Syntaxe des namespaces (ns:tag) non comprise
    Par LoK dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 31/12/2006, 10h39
  5. [XSLT] Déclaration de namespace dans un doc xml
    Par Vanille dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 06/12/2006, 15h26

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