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 :

[XSLT] templates recursifs


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut [XSLT] templates recursifs
    Bonjour/bonsoir:

    Je suis en train de créer un stylesheet XSL qui me transforme du DocBook/XML en XHTML, plus précisément en des listes embriquées. Mon code actuel est le suivant, mais je voudrais savoir si je peux le reduire avec des appels recursifs aux templates, et si oui, comment?
    Genre si je peux passer des paramètres, ca me permettra déjà de le reduire, mais est-ce qu'il y a une autre 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
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:db="http://docbook.org/ns/docbook"
        xmlns="http://www.w3.org/1999/xhtml">
        <xsl:output method="xml" encoding="utf-8" indent="yes"    
            doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
            doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>        
     
        <xsl:template match="//db:book">
            <html>
                <head>
                    <title>Kujaku[book] - <xsl:value-of select="db:title"/>
                    </title>
                </head>
                <body>
                    <xsl:if test="db:chapter">              
                    <ul class="chapter">                    
                        <xsl:apply-templates select="db:chapter"/>
                    </ul>                
                    </xsl:if>
                </body>
            </html>
        </xsl:template>
     
        <xsl:template match="//db:article">
            <html>
                <head>
                    <title>Kujaku[article] - <xsl:value-of select="db:title"/>
                    </title>
                </head>
                <body>
                    <xsl:if test="./db:sect1|./db:section">              
                        <ol class="section">                    
                            <xsl:apply-templates select="db:sect1|section"/>
                        </ol>                
                    </xsl:if>
                </body>
            </html>
        </xsl:template>
     
        <xsl:template match="db:chapter">
            <li  class="chapter">
                <xsl:value-of select="db:title"/>
                <xsl:if test="./db:sect1|./db:section">              
                    <ol class="section">                    
                        <xsl:apply-templates select="db:sect1|db:section"/>
                    </ol>                
                </xsl:if>
            </li>
        </xsl:template>
     
        <xsl:template match="db:sect1|db:section">
            <li class="section">
                <xsl:value-of select="db:title"/>
                <xsl:if test="./db:sect2|./db:section">              
                    <ol class="subsection">                    
                        <xsl:apply-templates select="db:sect2|db:section"/>
                    </ol>                
                </xsl:if>
            </li>
        </xsl:template>    
     
     
        <xsl:template match="db:sect2|//*/*/db:section">
            <li class="subsection">
                <xsl:value-of select="db:title"/>
                <xsl:if test="./db:sect3|./db:section">              
                    <ol class="subsubsection">                    
                        <xsl:apply-templates select="db:sect3|db:section"/>
                    </ol>                
                </xsl:if>
            </li>
        </xsl:template> 
     
        <xsl:template match="db:sect3|//*/*/*/db:section">
            <li class="subsubsection">
                <xsl:value-of select="db:title"/>
                <xsl:if test="./db:sect4|./db:section">              
                    <ol class="subsubsubsection">                    
                        <xsl:apply-templates select="db:sect4|db:section"/>
                    </ol>                
                </xsl:if>         
            </li>
        </xsl:template>
     
        <xsl:template match="db:sect4|//*/*/*/*/db:section">
            <li class="subsubsubsection">
                <xsl:value-of select="db:title"/>   
                <xsl:if test="./db:sect5|./db:section">              
                    <ol class="subsubsubsubsection">                    
                        <xsl:apply-templates select="db:sect5|db:section"/>
                    </ol>                
                </xsl:if>         
            </li>
        </xsl:template>
     
        <xsl:template match="db:sect5|//*/*/*/*/*/db:section">
            <li class="subsubsubsubsection">
                <xsl:value-of select="db:title"/>            
            </li>
        </xsl:template>
    </xsl:stylesheet>

    Si vous voulez savoir pourquoi je fais un truc aussi fou, c'est pour créer un CMS basé sur DocBook, et ceci constitue l'index du site. Le contenu sera chargé via AJAX si tout va bien.

    Mon problème, c'est que je peux avoir soit des éléments "sect1" à "sect5" imbriquées ou des éléments "section" imbriqués. Sans compter que je peux avoir soit une racine "book", soit "set", soit "article". ("book" peut contenir des "chapter" ou "part/chapter", puis "section"/"sect1", "article" contient directement des "section" ou "sect1")

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    personnellement je gèrerais cela comme ça :
    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
    	<xsl:template match="db:sect1|db:sect2|db:sect3|db:sect4|db:sect5|db:section">
    		<xsl:variable name="depth" select="count(ancestor-or-self::db:sect1|ancestor-or-self::deb:sect2|ancestor-or-self::deb:sect3|ancestor-or-self::deb:sect4|ancestor-or-self::deb:sect5|ancestor-or-self::deb:section)"/>
    		<li>
    			<xsl:attribute name="class">
    				<xsl:call-template name="get-class">
    					<xsl:with-param name="depth" select="$depth"/>
    				</xsl:call-template>
    			</xsl:attribute>
    			<xsl:value-of select="db:title"/>
    			<xsl:if test="db:sect1|db:sect2|db:sect3|db:sect4|db:sect5|db:section">
    				<ol>
    					<xsl:attribute name="class">
    						<xsl:call-template name="get-class">
    							<xsl:with-param name="depth" select="$depth + 1"/>
    						</xsl:call-template>
    					</xsl:attribute>
    					<xsl:apply-templates select="db:sect1|db:sect2|db:sect3|db:sect4|db:sect5|db:section"/>
    				</ol>				
    			</xsl:if>
    		</li>
    	</xsl:template>
    	<xsl:template name="get-class">
    		<xsl:param name="depth"/>
    		<xsl:choose>
    			<xsl:when test="$depth = 1">section</xsl:when>
    			<xsl:when test="$depth = 2">subsection</xsl:when>
    			<xsl:when test="$depth = 3">subsubsection</xsl:when>
    			<xsl:when test="$depth = 4">subsubsubsection</xsl:when>
    			<xsl:when test="$depth = 5">subsubsubsubsection</xsl:when>												
    		</xsl:choose>
    	</xsl:template>

  3. #3
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    ah, la fonction "count()", j'y avais pas pensé. Merci bien.

    Mais ma question sur les templates recursifs subiste néanmoins: est-ce que ca fonctionne? Si oui, comment est-ce que fonctionne, par exemple dans mon cas d'application?

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Kurisu
    Mais ma question sur les templates recursifs subiste néanmoins: est-ce que ca fonctionne? Si oui, comment est-ce que fonctionne, par exemple dans mon cas d'application?
    Qu'est-ce que je t'ai proposé, sinon un template récursif ? Et, sauf erreur grossière de ma part, oui ça fonctionne.

    De par sa conception XSLT est un langage récursif, je ne saisis donc pas très bien ta question...

  5. #5
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    en fait, j'avais répondu avant d'avoir vraiment analysé le code, qui fonctionne d'ailleurs vraiment très bien. Donc ma question n'a pas vraiment lieu.

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

Discussions similaires

  1. [XSLT][Templates][PHP] Que choisir pour gérer ses templates
    Par ChriGoLioNaDor dans le forum Langage
    Réponses: 8
    Dernier message: 03/09/2008, 20h49
  2. [XSLT] Template imbriqué dans un if
    Par LeNouv_O dans le forum XSL/XSLT/XPATH
    Réponses: 26
    Dernier message: 20/06/2006, 14h40
  3. [XSLT] template unique pour 2 utilisations différentes
    Par sozie9372 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/04/2006, 15h24
  4. [XSLT] template paramétré et XPATH
    Par 242 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 30/11/2005, 09h39
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31

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