Discussion: XSLT et namespace

  1. #1
    Membre averti
    Inscrit en
    février 2011
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 342
    Points : 410
    Points
    410

    Par défaut XSLT et namespace

    Bonjour,

    Avec ce fichier XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.2">
      <RegistrationInfo>
        <Date>2014-01-30T16:47:39.1426044</Date>
        <Author>Romeo</Author>
        <Description>fights for the love of his life</Description>
      </RegistrationInfo>
    </Task>
    je désire changer l'auteur. Au lieu de Romeo, je veux avoir Juliette.
    J'utilise cette transformation xslt
    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"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="UTF-16"/>
     
    <xsl:template match="@*|node()">
    	<xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
     
        <xsl:template match="/Task/RegistrationInfo/Author">
    		<Author>Juliette</Author>
        </xsl:template>
     
    </xsl:stylesheet>
    qui fonctionne bien et me donne le résultat que je veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.2">
    	<RegistrationInfo>
    		<Date>2014-01-30T16:47:39.1426044</Date>
    		<Author>Juliette</Author>
    		<Description>fights for the love of his life</Description>
    	</RegistrationInfo>
    </Task>
    Tout cela semble très bien.

    Le problème, c'est que mon fichier de départ est légèrement différent : il contient une référence xmlns qui m'empêche d'utiliser ma transformation xslt.
    Le vrai fichier de départ est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
      <RegistrationInfo>
        <Date>2014-01-30T16:47:39.1426044</Date>
        <Author>Romeo</Author>
        <Description>fights for the love of his life</Description>
      </RegistrationInfo>
    </Task>
    Avec cet attribut xmlns, mon fichier xslt ne donne rien !

    Pourriez-vous svp m'expliquer pourquoi ?
    Comment puis-je corriger mon fichier xslt pour qu'il fonctionne avec cet attribut xmlns ?

    Merci pour votre aide et vos explications

  2. #2
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 085
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 085
    Points : 1 880
    Points
    1 880

    Par défaut

    Dans le document xml au départ, il y a une declaration de namespace; c'est bien compris je pense et c'est une declaration par défaut, et par par défaut, on veut dire simplement qu'elle entend de s'appliquer même qu'il n'y a pas un préfixe explicit attaché au nom local du noeud d'élément, mais, il faut faire attention à ça, qu'elle entend aussi par désigne du langage de ne pas s'appliquer pour des attributs de cette façon par implication.

    Pourtant, dans xslt, même si on déclare le même namespace par défaut dans la racine xsl:style mimique à ce qu'on fait dans le document xml, les composants de xpath... dans les @match et @select sont agnostiques à cette déclaration. On fait une déclaration de ce namespace avec un préfixe arbitraire mais syntaxiquement correct bien entendu. Et c'est ce qu'il faut faire effectivement et généralement.

    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns="http://schemas.microsoft.com/windows/2004/02/mit/task">
    <xsl:output method="xml" indent="yes" encoding="UTF-16"/>
     
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
     
    <xsl:template match="/ns:Task/ns:RegistrationInfo/ns:Author">
        <xsl:copy>Juliette</xsl:copy>
    </xsl:template>
     
    </xsl:stylesheet>
    Et avec xsl:copy, la sortie s'applique automatiquement la déclaration par défaut. C'est plus net, pourtant pas plus. Voilà.

  3. #3
    Membre averti
    Inscrit en
    février 2011
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 342
    Points : 410
    Points
    410

    Par défaut

    Merci beaucoup.
    Cela m'aide bien.

Discussions similaires

  1. [XSLT] namespace
    Par peyote dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 19/01/2010, 17h19
  2. [XSLT] Probleme de selection avec namespaces
    Par Ludo_xml dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 01/06/2005, 15h32
  3. [XSLT]Sortir les balise d'un namespace d'un XML
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 12/04/2005, 12h30
  4. [XSLT]petit(s) pb(s) avec les xmlns et <xsl:namespace-ali
    Par Swoög dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/01/2005, 18h04
  5. namespace dans feuille xslt : comment ca marche exactement ?
    Par guipom dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 11/11/2004, 17h21

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