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 :

Soucis Xpath dans l'utilisation de variables en XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Soucis Xpath dans l'utilisation de variables en XSL
    Bonjour,

    J'ai actuellement pour tache d'améliorer la rédaction d'un feuille de style XSL dont le style est assez lourd. Cette feuille de style récupère des informations stockés dans des attributs d'éléments d'un fichier XSD, et affiche une page HTML sous forme d'arbre.
    La fonction permettant d'afficher des icônes à côtés des différents nœuds et éléments se présentais comme cela:

    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
    30
    31
    32
    33
     
    <xsl:template name="displayIcon">
      <xsl:choose>
       <xsl:when test="@type = 'udt:TextType'">
        <img
         src="data:image/png;base64,..."
         title="udt:TextType" />
       </xsl:when>
       <xsl:otherwise>
        <xsl:choose>
         <xsl:when test="@type = 'udt:DateTimeType'">
          <img
           src="data:image/png;base64,..."
           title="udt:DateTimeType" />
         </xsl:when>
         <xsl:otherwise>
          <xsl:choose>
           <xsl:when test="@type = 'ContactType'">
            <img
             src="data:image/png;base64,..."
             title="ContactType" />
           </xsl:when>
           <xsl:otherwise>
            <xsl:choose>
            .............................
            </xsl:choose>
           </xsl:otherwise>
          </xsl:choose>
         </xsl:otherwise>
        </xsl:choose>
       </xsl:otherwise>
      </xsl:choose>
     </xsl:template>
    C'est fonctionnel, mais très lourd car il y a beaucoup d'images. J'ai dans l’idée de créer des variables pour chaque images, puis faire en sorte qu'à l'appel de la fonction, le programme compare le nom de l'attribut avec le nom de chaque variables (for-each) et sélectionne l'image si les noms sont égaux. J'ai cependant un soucis dans la sélection des variables et de leurs valeurs via Xpath. Je vous montre un prototype non fonctionnel mais qui vous montrera mieux ce que j'ai en tête. Est-il possible de faire les choses de cette manière ou est-ce que je me trompe complétement de méthode ?

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <xsl:variable name="udt:TextType"
      xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
      select="'data:image/png;base64,..." />
     <xsl:variable name="udt:DateTimeType"
      xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
      select="'data:image/png;base64,..." />
     <xsl:variable name="ContactType"
      select="'data:image/png;base64,..." />
     
     
    <xsl:template name="displayIcon"
      xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
      xmlns:qdt="fr:gouv:culture:archivesdefrance:seda:v1.0:QualifiedDataType:1">
     
      <xsl:for-each select="xsl:variable">
       <xsl:choose>
        <xsl:when test="@type = xsl:variable/@name">
         <img>
          <xsl:attribute name="src">
           <xsl:value-of select="xsl:variable/@select" />
          </xsl:attribute>
          <xsl:attribute name="title">
           <xsl:value-of select="xsl:variable/@name" />
          </xsl:attribute>
         </img>
        </xsl:when>
        <xsl:otherwise>
         <xsl:choose>
          <xsl:when test="@name = xsl:variable/@name">
           <img>
            <xsl:attribute name="src">
             <xsl:value-of select="xsl:variable/@select" />
            </xsl:attribute>
            <xsl:attribute name="title">
             <xsl:value-of select="xsl:variable/@name" />
            </xsl:attribute>
           </img>
          </xsl:when>
          <xsl:otherwise>
           <img>
            <xsl:attribute name="src">
             <xsl:value-of select="$Default" />
            </xsl:attribute>
            <xsl:attribute name="title">
             <xsl:value-of select="@name" />
            </xsl:attribute>
           </img>
          </xsl:otherwise>
         </xsl:choose>
        </xsl:otherwise>
       </xsl:choose>
      </xsl:for-each>
     </xsl:template>

  2. #2
    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,

    c'est faisable, mais pour utiliser les éléments de la feuille de style elle-même, il faut utiliser document('')

    Il y a aussi moyen de beaucoup simplifier tout ça. Pour donner un exemple je ferais quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:variable name="icons-holder">
      <icon type="udt:TextType" url="data:image/png;base64,..." />
      <icon type="udt:DateTimeType" url="data:image/png;base64,..." />
      <icon type="ContactType" url="data:image/png;base64,..." />
    </xsl:variable>
     
    <xsl:variable name='icons' select="document('')//xsl:variable[@name='icons-holder']/icon"/>
     
    <xsl:template name="displayIcon">
      <img src="{$icons[@type = current()/@type]/@url}" title="{@type}" />
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    C'est vrai que cette solution est plus élégante et concise. Cependant en voulant l'essayer, je me rend compte que dans ma page html, le champ src de mon image est vide. je vais essayer de retravailler ça pour voir si ça passe.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Toujours pas de solution, j'ai tenté pas mal de choses mais impossible de placer la string de url dans src... Please help !

  5. #5
    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
    Sans code ça va être compliqué. Tu as essayé quoi ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Le message que j'ai posté n'as jamais été accepté... J'avais du poster du code trop long...

    Je pense que le soucis vient de la fonction document(), j'ai essayé de créer un fichier icons.xml annexe contenant :
    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
     
    <icons>
    	<icon1 name="'udt:TextType'" img="data:image/png;base64,...." />
    	<icon name="udt:DateTimeType" img="data:image/png;base64,...." />
    	<icon name="ContactType" img="data:image/png;base64,...." />
    	<icon name="qdt:ArchivesIDType" img="data:image/png;base64,...." />
    	<icon name="AddressType" img="data:image/png;base64,...." />
    	<icon name="CommunicationType" img="data:image/png;base64,...." />
    	<icon name="ArchiveType" img="data:image/png;base64,...." />
    	<icon name="qdt:CodeLanguageType" img="data:image/png;base64,...." />
    	<icon name="ArchiveObjectType" img="data:image/png;base64,...." />
    	<icon name="DocumentType" img="data:image/png;base64,...." />
    	<icon name="HashCodeType" img="data:image/png;base64,...." />
    	<icon name="SignatureType" img="data:image/png;base64,...." />
    	<icon name="ArchivalAgency" img="data:image/png;base64,...." />
    	<icon name="Repository" img="data:image/png;base64,...." />
    	<icon name="TransferringAgency" img="data:image/png;base64,...." />
    	<icon name="OriginatingAgency" img="data:image/png;base64,...." />
    	<icon name="ContentDescriptionType" img="data:image/png;base64,...." />
    	<icon name="KeywordType" img="data:image/png;base64,...." />
    	<icon name="AppraisalRulesType" img="data:image/png;base64," />
    </icons>
    Et de récuperer les infos dans ma feuille xslt avec les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:variable name="icon" select="document('icons.xml', /src/resources)/icons/icon"/>
     
    <xsl:template name="displayIcon">
    	<img src="$icon[@name = current()/@type]/@img"/>
    </xsl:template>
    mais je ne récupère aucune valeur, sachant que même avec simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:template name="displayIcon">
    	<txt>
    		<xsl:value-of select="document('icons.xml', /src/resources)/icon1/@name" />
    	</txt>
    </xsl:template>
    le résultat est le même...
    Et même en rentrant un chemin complètement aléatoire pour le document je n'ai pas de message d'erreur. Est-ce que le format du chemin que j'ai rentré est mal formé ?

  7. #7
    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
    En xslt 1.0, il vaut mieux éviter la complication quand une fonction ou une construction devrait méler la notion de node-set tant que possible. Ici, on peut le faire très simplement comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!--
    <xsl:variable name="icon" select="document('icons.xml', /src/resources)/icons/icon"/>
    -->
    <xsl:variable name="icon" select="document('icons.xml')/src/resources/icons/icon"/>

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Ok, en voyant ton post j'ai vu que j'avais mal compris ce que devait représenter le 2ème argument de la fonction "document()". Du coup j'ai présenté ça d'une autre manière et tout marche bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	<xsl:template name="displayIcon">
    		<img src="{document('src/resources/icon.xml')/icons/icon[@name = current()/@type|current()/@name]/@img}" name="{current()/@type}" />
    	</xsl:template>
    Merci pour le coup de main !

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

Discussions similaires

  1. [CR XI] Problème dans l'utilisation des variables partagées
    Par sep_ghis dans le forum Formules
    Réponses: 14
    Dernier message: 03/07/2008, 16h32
  2. Réponses: 1
    Dernier message: 30/05/2008, 11h51
  3. Réponses: 2
    Dernier message: 17/09/2005, 17h43
  4. Réponses: 1
    Dernier message: 27/07/2005, 17h08
  5. Utilisation de variables dans plusieurs classes
    Par dedeloux dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2005, 17h25

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