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 :

en quoi la racine et son namespace influencent-t-ils la transformation ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut en quoi la racine et son namespace influencent-t-ils la transformation ?
    Bonjour,

    Je viens de découvrir quelque chose que je ne comprends pas. Qui pourrait m'expliquer ?
    <!-- en fait, il y a beaucoup de choses que je ne comprends pas dans la vie mais, pour le moment, limitons nous à celle-ci -->
    J'ai le fichier XML suivant
    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="UTF-8"?>
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2017-11-21T09:39:16">
    	<CstmrDrctDbtInitn>
    		<ID_FK>35</ID_FK>
    		<GrpHdr>
    			<ID_FK>35</ID_FK>
    			<MsgId>A0000000035</MsgId>
    			<CreDtTm>2017-11-21T09:39:16</CreDtTm>
    			<NbOfTxs>8</NbOfTxs>
    			<CtrlSum>8417.73</CtrlSum>
    		</GrpHdr>
    	</CstmrDrctDbtInitn>
    </dataroot>
    Il contient deux balises ID_FK que je désire éliminer.
    J'applique la transformation xslt suivante
    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="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="*">
    		<xsl:copy>
    			<xsl:apply-templates select="node()"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<!-- je supprime toutes les balises ID_FK -->
    	<xsl:template match="//ID_FK"/>
     
    </xsl:stylesheet>
    et cela fonctionne parfaitement : mes balises ID_FK disparaissent.

    Maintenant, j'applique la même transformation xslt sur le fichier XML suivant qui, à part la ligne racine, est identique
    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="UTF-8"?>
    <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:xxxxx">
    	<CstmrDrctDbtInitn>
    		<ID_FK>35</ID_FK>
    		<GrpHdr>
    			<ID_FK>35</ID_FK>
    			<MsgId>A0000000035</MsgId>
    			<CreDtTm>2017-11-21T09:39:16</CreDtTm>
    			<NbOfTxs>8</NbOfTxs>
    			<CtrlSum>8417.73</CtrlSum>
    		</GrpHdr>
    	</CstmrDrctDbtInitn>
    </Document>
    et dans ce cas-ci, les deux balises ID_FK ne disparaissent pas ! Pourquoi ????????

    La seule différence du deuxième fichier XML est la racine <Document xmlns: xsi="http://www.w3.org/200...

    Pourquoi ma transformation ne fonctionne-t-elle pas ?
    Auriez-vous la bonté de bien vouloir m'expliquer. Je ne veux pas mourir idiot.

    D'avance, merci.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    [0] Le cas réussi déjà d'abord:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="//ID_FK"/>
    Il mache et il n'y a pas trop de quoi critiqué; mais je dirais si on le serre un peu plus, plus localisé, plus intégré organiquement dans le xslt, ce serait mieux conceptuellement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="ID_FK" />
    [1] Dans le cas en question:
    [1.1] La partie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" n'a rien à voir avec le problèmatique et c'est dit pour vous en assurer.
    [1.2] La partie xmlns="urn:iso:xxxxx" a tout à voir avec le problèmatique. Il s'agit une déclaration de namespace sans avoir un préfixe souvent paru et s'en servi après. L'absence d'un préfixe veut parler d'un sous-entendu, celui qu'un namespace pour l'élément en contexte (d'ailleurs pas pour les attributs d'une façon automatique) est en fait déclaré par défaut au sens de malgré et de par l'absence d'un préfixe même. Et puisque le préfixe est absent, il est sensé de fixer aussi une règle de hériéité de ce namespace pour ses enfants dans le même namespace et pour qui on n'a besoin de déclarer par défaut chaque fois avec xmlns="..." pour chacun d'eux parce que pour le cas de la déclaration préfixée, on n'a nullement besoin de déclarer chaque fois le préfixe pour s'en servir, il suffit de mettre en évidence du même préfixe et c'est tout. La règle est que ses enfants sans préfixe héritent ce même namespace sauf déclarer autrement. Il faut noter que les attributs ne subissent pas ces règles. Le namespace, si il y en a, des attributs doit être déclaré toujours préfixé. Voilà presque tout ce qu'on doit savoir sur ce sujet.

    [3] Dans la pratique xslt 1.0, on fait ça pour ladite fonctionnalité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[local-name()='ID_FK' and namespace-uri()='urn:iso:xxxxx']" />
    [3.1] Parfois, si on s'en foule du namespace précis, on fait ça plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[local-name()='ID_FK']" />
    [4] Dans xslt 2.0, qu'il supporte la notion de préfixe joker, on peut faire le même que xslt 1.0 et en plus si on veut, pour le cas [3.1], comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*:ID_FK" />

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ouais je vais quand même reformuler, hein.

    en quoi la racine et son namespace influencent-t-ils la transformation ?
    Ben le namespace de la racine, c'est le namespace de tous les autres éléments. Sauf ceux qui s'en déclarent un autre.

    Les éléments héritent des namespaces connus de leur parent, donc en remontant toute l'ascendance, de la racine.
    Dans ton exemple, tu as deux déclarations de namespaces : xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" et xmlns="urn:iso:xxxxx". La première a un préfixe et ce préfixe n'est pas utilisé. Donc elle n'est pas utilisée. La deuxième n'a pas de préfixe, ça veut dire que c'est le namespace par défaut, celui des éléments qui n'ont pas de préfixe.
    Donc c'est le namespace de <Document> et de tous ses descendants.

    Pourquoi ma transformation ne fonctionne-t-elle pas ?
    Parce que dans ton deuxième exemples, les éléments <ID_FK> sont dans le namespace xmlns="urn:iso:xxxxx", comme tous les autres éléments.

    Or dans ton template, tu fais match="//ID_FK" sans préciser de namespace, donc tu vises les éléments <ID_FK> qui n'ont pas de namespace. Autrement dit ça ne concerne pas les éléments <ID_FK> qui sont dans le namespace xmlns="urn:iso:xxxxx", ce template ne s'applique pas à eux, ils prennent donc le même template que les autres et sont copiés comme les autres.

    Pour viser les éléments qui ont un namespace, il faut préciser ce namespace. Tu pourrais par exemple faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="//uix:ID_FK" xmlns:uix="urn:iso:xxxxx" />
    xmlns:uix="urn:iso:xxxxx" déclare le namespace en question, et uix:ID_FK désigne un élément ID_FK qui est dans ce namespace. Là ça matche, là ça les vire.

    Tu te demandes peut-être pourquoi j'ai mis ce préfixe uix: alors que dans ton document il n'y avait pas de préfixe, le namespace est par défaut. Alors déjà à la place de uix tu mets ce que tu veux, toto: ou zorglub: ou peu importe, du moment que tu prends le même à la déclaration et à l'utilisation. C'est un genre de raccourci si tu veux.
    Et si j'ai mis un préfixe au lieu de pas en mettre, c'est parce qu'il n'y a pas le choix : en XML général on peut faire des namespaces par défaut... Mais dans les expressions match et XPath, non. Dans les expressions match et XPath, s'il n'y a pas de préfixe, il n'y a pas de namespace.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Merci beaucoup pour vos explications.

Discussions similaires

  1. XSLT pour changer le nom de la racine et le namespace
    Par PipoWIL dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 21/11/2017, 11h14
  2. Réponses: 20
    Dernier message: 09/08/2011, 17h29
  3. Quoi choisir pour créer son site
    Par damien77 dans le forum Autres langages pour le Web
    Réponses: 2
    Dernier message: 18/06/2007, 10h44
  4. [xsl] namespace dans le html apres transformation xslt...
    Par -ADX- dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/05/2006, 14h16
  5. [JVM]C'est quoi la méthode clinit ? Son utilité ?
    Par elitost dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 14h15

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