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 :

Comment passer un namespace comme paramètre d'une feuille XSLT


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut Comment passer un namespace comme paramètre d'une feuille XSLT
    Bonjour,

    J'ai besoin d'utiliser une variable dans un fichier xsl pour m'indiquer un namespace à utiliser.

    J'arrive bien à recevoir ma variable pour le traitement xsl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:param name="thisNameSpace"></xsl:param>
    Cependant j'ai du mal ensuite à l'utiliser.

    Certains parties marchent comme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
          <xsl:when test="name() = concat($thisNameSpace,':GetCoverage')">
            <xsl:call-template name="GetCoverage"/>
          </xsl:when> 
     
    ...
     
        <xsl:if test="not(concat($thisNameSpace,':CoverageParameters'))">
          <!-- 'CoverageParameters' tag is mandatory -->
          <xsl:message terminate="no">$ERROR$InvalidParameterValue$Missing 'CoverageParameters' tag</xsl:message>
        </xsl:if>
    Cependant je bloque actuellement pour appeller un template avec une variable dont le nom de cette variable est lui-même basé sur ma variable thisNameSpace.

    ce code ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            <xsl:call-template name="ParseCoverageParameters">
              <xsl:with-param name="coverageParameterschildreen" select="$thisNameSpace:CoverageParameters/*"/>
            </xsl:call-template>
    A la base sans l'utilisation de variable (ex: select="value1:CoverageParameters/*") ca marche.

    Je sais que la réponse doit surement se trouver dans un tuto mais je cherche et je ne trouve pas, comme dirait axelle red.

    Si quelqu'un si connaissant peut me faire gagner du temps sur le language xsl ou me rencarder sur les bonnes facons de faire ou m'expliquer je suis tout ouïe.

    Merci pour votre aide,
    Cordialement,
    Christophe.

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Dois-je utiliser msxsl:node-set() pour construire l'élément avec de le passer en paramètre?

  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
    Hello,

    De ce que j'en vois, ton paramètre n'est pas un namespace, mais un préfixe de namespace.
    La différence est importante. Parce que les préfixes de namespace, on s'en tamponne. Que ça soit 'toto:' ou 'zorglub:' on s'en fiche. Le namespace est le même, c'est le préfixe qui change, et le préfixe on met ce qu'on veut à la place.

    Bref, ton paramètre, tu ne devrais même pas en avoir.

    Les fichiers XML que tu transformes, contiennent certainement quelque chose comme xmlns:value1="http://coolthing.org/machin" ou xmlns:tns="http://coolthing.org/machin" ou encore d'autres choses,
    où ce qu'il y a entre xmlns: et = change tout le temps, mais l'URI après le = ne change jamais. C'est ça le namespace. C'est ça qu'il faut viser.

    Comment le faire dans le code que tu nous montres, eh bien, pour commencer, il faut déclarer ce namespace dans ta feuille de style, genre qu'elle ressemble à ça :

    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:cool="http://coolthing.org/machin"
      >
    Ici j'ai mis :cool mais, je me répète, c'est un préfixe et un préfixe on met ce qu'on veut à la place. tintin ou zorglub, peu importe. Par contre l'URI à droite, c'est le namespace, il faut que ce soit la même que dans les fichiers XML.

    Puis tes expressions ressembleront à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:when test="self::cool:GetCoverage">
      <xsl:call-template name="GetCoverage"/>
    </xsl:when>
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="local-name() = 'GetCoverage' and namespace-uri() = 'http://coolthing.org/machin'">
    le if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="not(cool:CoverageParameters)">
    (Note : le xsl:if que tu as montré est toujours faux, comme si tu avais fait test="1 = 2".)

    et le with-param :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="ParseCoverageParameters">
      <xsl:with-param name="coverageParameterschildreen" select="cool:CoverageParameters/*"/>
    </xsl:call-template>
    Citation Envoyé par lavoyech Voir le message
    Je sais que la réponse doit surement se trouver dans un tuto
    Ben non, pas en raisonnant comme ça.

    Citation Envoyé par lavoyech Voir le message
    Dois-je utiliser msxsl:node-set() pour construire l'élément avec de le passer en paramètre?
    Il vaut mieux pas.
    De une, c'est une fuite en avant dans la mesure où tu cherches à résoudre un problème qui n'existe pas. Il vaut mieux faire les choses comme il est prévu de les faire.
    De deux, cette fonction n'est pas standardisée en XSLT. Si ton moteur XSLT gère cette fonction, et que tu travailles seul dans ton coin sans donner ton XSLT à personne, au fond pourquoi pas. Mais c'est un coût d'intégration supplémentaire, pour rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Merci pour ta réponse rapide je vais essayer de mettre en place ce que tu dis et qui est beaucoup plus logique.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Bonjour,

    Je reviens vers vous concernant une question dans le même domaine (j'ai eu des vacances entre temps ).

    Est-il possible de déclarer un namespace de façon dynamique avec un paramètre passé au fichier xsl?

    de la façon suivante:

    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
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:wfs="http://www.opengis.net/wfs"
                  xmlns:ogc="http://www.opengis.net/ogc"
                  xmlns:gml="http://www.opengis.net/gml"
                  xmlns:cat="$thisNameSpace"
                  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                  xmlns:user="urn:my-scripts"
                  exclude-result-prefixes="xsl wfs ogc gml msxsl user cat hma">
      <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
      <xsl:param name="thisNameSpace"></xsl:param>
    
    ....
    Inutile de préciser qu'ici ça ne marche pas. Par la suite je n'arrive pas a détecté les balise de type <cat:

    L'idée est j'ai donc plusieurs requête en entrée de structure équivalente ayant pour seule différence la valeur du namespace cat:thisNamespace.

    Afin de n'avoir qu'un seul fichier xsl j'essaye de faire donc passer la valeur "thisNameSpace" avec un paramètre.

    Est-ce possible ou alors la valeur de ce namespace ne peut être changé dinamiquement?

    Cordialement,
    Christophe.

  6. #6
    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
    Hello,

    passer un namespace en paramètre est possible, ce qui permet de rendre la gestion du namespace dynamique.

    ... Mais... L'idée de "namespace dynamique" n'est pas très maline.
    Le principe du namespace, sa raison d'être, c'est qu'il ne peut pas être dynamique. C'est pour ça qu'il existe. Si on voulait du dynamique, il n'y aurait pas de namespace.

    ... Mais ça, bien sûr, ce n'est pas tout le monde qui le sait dans l'informatique. Et donc il existe des gens qui ont fait l'erreur de faire des formats XML qui ont "parfois ce namespace-ci et parfois ce namespace-là." Ces gens-là ne comprenaient pas ce qu'ils faisaient, mais ça existe, on est bien d'accord.

    Dans ce cas-là la réponse la plus logique n'est pas de chercher quel est le namespace qui a été utilisé et s'en servir, la réponse est d'ignorer complètement le namespace parce qu'il a été mal utilisé et que le mieux serait qu'il n'y en ait pas.

    La méthode est de se baser sur le local-name des éléments. Il s'agit de leur nom, sans le namespace associé.
    On peut s'en servir des manières suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:when test="local-name() = 'GetCoverage'">
    (attention c'est une string, donc entre ' et ' ou entre " et ". Ça ne marche pas avec GetCoverage sans quotes, qui récupère un élément et non pas le nom de cet élément.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[local-name() = 'GetCoverage']">
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [vb.net] utilisation d'une variable dans le code
    Par arnolem dans le forum Windows Forms
    Réponses: 9
    Dernier message: 30/09/2005, 19h22
  2. modifier une variable dans un fichier
    Par Guismay dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2005, 19h46
  3. Réponses: 9
    Dernier message: 05/07/2005, 08h37
  4. Pl/SQL utilisation d'une variable dans un select
    Par larg dans le forum PL/SQL
    Réponses: 17
    Dernier message: 30/11/2004, 17h08
  5. Réponses: 13
    Dernier message: 14/06/2003, 22h15

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