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 :

[Débutant][XSLT] Passage structure plane à arborescente [Sources]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 33
    Par défaut [Débutant][XSLT] Passage structure plane à arborescente
    Bonjour
    je voudrais faire une transformation XSL vers html "à plat et alphabétiquement" côté client d'un fichier xml représentant un menu vertical hiérarchique (c-à-d avec dossier et sous-dossier dont le niveau d'imbrication peut être multiple et n'est pas connu à priori)
    La difficulté pour moi est de tester l'imbrication des dossiers sachant que chaque élément du fichier xml, chaque item du menu, possède juste 4 informations: son nom, son type (menu, dossier ou contenu) l'identifiant unique de son dossier parent (1=master étant le premier niveau) et un identifiant unique donc.
    ex xml:
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="menu.xsl" type="text/xsl"?>
    <plist>
      <item>
        <nom>master</nom>
        <type>menu</type>
        <parent></parent>
        <idunique>1</idunique>
      </item>
      <item>
        <nom>Dossier2</nom>
        <type>dossier</type>
        <parent>1</parent>
        <idunique>2</idunique>
      </item>
      <item>
        <nom>Dossier1</nom>
        <type>dossier</type>
        <parent>1</parent>
        <idunique>3</idunique>
      </item>
      <item>
        <nom>DossierX</nom>
        <type>dossier</type>
        <parent>5</parent>
        <idunique>4</idunique>
      </item>
      <item>
        <nom>Dossier</nom>
        <type>dossier</type>
        <parent>2</parent>
        <idunique>5</idunique>
      </item>
      <item>
        <nom>DossierY</nom>
        <type>dossier</type>
        <parent>5</parent>
        <idunique>6</idunique>
      </item>
      <item>
        <nom>Element</nom>
        <type>contenu</type>
        <parent>3</parent>
        <idunique>7</idunique>
      </item>
      <item>
        <nom>ElementA</nom>
        <type>contenu</type>
        <parent>4</parent>
        <idunique>8</idunique>
      </item>
      <item>
        <nom>ElementB</nom>
        <type>contenu</type>
        <parent>4</parent>
        <idunique>9</idunique>
      </item>
      <item>
        <nom>Element1</nom>
        <type>contenu</type>
        <parent>6</parent>
        <idunique>10</idunique>
      </item>
      <item>
        <nom>Element1</nom>
        <type>contenu</type>
        <parent>1</parent>
        <idunique>11</idunique>
      </item>
      <item>
        <nom>Element3</nom>
        <type>contenu</type>
        <parent>1</parent>
        <idunique>12</idunique>
      </item>
      <item>
        <nom>Element2</nom>
        <type>contenu</type>
        <parent>1</parent>
        <idunique>13</idunique>
      </item>
      <item>
        <nom>Element2</nom>
        <type>contenu</type>
        <parent>6</parent>
        <idunique>14</idunique>
      </item>
      <item>
        <nom>Element</nom>
        <type>contenu</type>
        <parent>2</parent>
        <idunique>15</idunique>
      </item>
    </plist>
    je voudrais obtenir (pour le moment) ce genre de résultat simple "à plat":

    Master.
    -Dossier1.
    --Element.
    -Dossier2.
    --Dossier.
    ---DossierX.
    ----ElementA.
    ----ElementB.
    ---DossierY.
    ----Element1.
    ----Element2.
    --Element.
    -Element1.
    -Element2.
    -Element3.

    J'aimerais que quelqu'un me mette sur la voie, m'indiquant un lien ou un nom de méthode.
    Ce doit être un cas classique qui doit s'appliquer à des menus déroulants verticaux comme à des sommaires.

    Note: j'ai crée un AppleScript qui génère ce type de fichier xml à partir du menu playlist d'iTunes pour ceux que ça intéresse et pour vous donner une idée de ce que j'essaie de reproduire.

    J'espère que cela vous intéressera
    Merci.

  2. #2
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 33
    Par défaut 3 questions
    Après avoir un peu potassé j'ai quelques questions:

    1/ un template peut-il s'appeler lui-même?
    si dans le template il y a un test conditionnel qui si il est vérifié implique un re-appel de lui-même et une ré-assignation de la variable de test peut-on passer cette variable sachant qu'on changera de noeud (va-t-elle persister)?

    2/quel est l'intérêt d'utiliser des attributs plutôt que des balises?
    outre le fait qu'on diminue un peu le poids du document (pour un usage web) quelle-est l'incidence sur le temps de traitement?

    3/indidence de la balise <?xml-stylesheet... dans le cas d'une utilisation dans un autre document xml via document():
    Dans ce cas faut-il la supprimer du fichier qui sera inclus?
    Y a-t-il risque de conflit ou la feuille de style ainsi déclarée sera ignorée?

    Merci

  3. #3
    Membre émérite
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Par défaut
    just eune question pourquoi as tu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <nom>Dossier2</nom>
        <type>dossier</type>
        <parent>master</parent>
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <nom>Dossier2</nom>
        <type>dossier</type>
        <parent>menu</parent>
    l'utilisation d'attribut permet de faire des traitements plus simple (compare un attribut à une clé dans les SGBDR). Mais tu peux utiliser les deux.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 33
    Par défaut
    Citation Envoyé par fraoustin Voir le message
    just eune question pourquoi as tu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <nom>Dossier2</nom>
        <type>dossier</type>
        <parent>master</parent>
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <nom>Dossier2</nom>
        <type>dossier</type>
        <parent>menu</parent>
    Merci de ton intérêt

    C'est une négligence de ma part lorsque j'ai écris cet exemple.
    J'ai fait la correction...

    J'ai aussi changé la balise parent, elle ne contient plus le nom du dossier parent mais son identifiant unique (permettra d'avoir le même nom pour plusieurs item comme dans le menu playlist d'iTunes que j'essaie de reproduire dans une page web)

  5. #5
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 33
    Par défaut premier script (basique de débutant) en xsl
    Première étape: afficher le contenu d'un dossier en fonction de la variable "currentFolder"

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
    <xsl:variable name="IDcurrentFolder">1</xsl:variable>
    <xsl:template match="/">
     
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <style type="text/css" media="all">
    li {
    	list-style:none
    }
    </style>
    <title>Menu</title>
    </head>
     
    <body>
    <xsl:call-template name="master" />
    </body>
    </html>
     
    </xsl:template>
      <xsl:template name="master">
        <ul><xsl:call-template name="dossier" /></ul>
        <ul><xsl:call-template name="contenu" /></ul>
      </xsl:template>
     
      <xsl:template name="dossier">
        <xsl:for-each select="plist/item">
         <xsl:sort select="." order="ascending" />
            <xsl:if test="type = 'dossier' and parent = $IDcurrentFolder">
                  <xsl:element name="li">
                    <xsl:value-of select='nom' />
                  </xsl:element>
            </xsl:if>
        </xsl:for-each> 
      </xsl:template>
     
      <xsl:template name="contenu">
        <xsl:for-each select="plist/item">
         <xsl:sort select="." order="ascending" />
          <xsl:if test="type = 'contenu' and parent = $IDcurrentFolder">
              <xsl:element name="li">
          		<xsl:value-of select='nom' />
              </xsl:element>
          </xsl:if>
        </xsl:for-each> 
      </xsl:template>
     
    </xsl:stylesheet>
    je vais continuer aujourd'hui et essayé de faire un "traitement récursif" dans un for each pour traiter les dossiers un par un.
    Je vais essayer de placer dans le template "dossier" un re-appel du template "master" avec ré-assignation de la variable de test "currentFolder".
    C'est mon idée pour l'instant...

  6. #6
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 33
    Par défaut traitement récursif des sous-dossiers
    en essayant ça: (traitement récursif des sous-dossiers)
    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
     
      <xsl:template name="dossier">
        <xsl:for-each select="plist/item">
         <xsl:sort select="." order="ascending" />
            <xsl:if test="type = 'dossier' and parent = $IDcurrentFolder">
                  <xsl:element name="li">
                    <xsl:value-of select='nom' />
                  </xsl:element>
     
                  <-- Traitement récursif des sous-dossiers -->
                  <xsl:variable name="IDcurrentFolder" select='idunique' />
                  <xsl:call-template name="master" />
     
            </xsl:if>
        </xsl:for-each> 
      </xsl:template>
    et bien... ça ne change rien

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

Discussions similaires

  1. [débutant]Pb de structure du programme
    Par Tymk dans le forum C++
    Réponses: 7
    Dernier message: 03/07/2008, 08h56
  2. Réponses: 4
    Dernier message: 26/02/2007, 08h51
  3. [Débutant][XSLT]Eviter les doublons
    Par leminipouce dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/10/2005, 11h34
  4. [Débutant - XSLT] instructions serveurs possibles ?
    Par sempire dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 06/10/2005, 11h06
  5. [XSLT] passage de parametres
    Par bmasimo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 24/06/2005, 07h27

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