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 :

Récupérer la profondeur maximale d'un élément [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 313
    Points : 52 905
    Points
    52 905
    Par défaut Récupérer la profondeur maximale d'un élément


    j'ai un XML de ce type :

    Code xml : 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
    <A>
    	<B>
    	</B>
    	<B>
    		<B>
    		</B>
    		<B>
    		</B>
    		<B>
    		</B>
    		<B>
    			<B>
    			</B>
    			<B>
    			</B>
    		</B>
    	</B>
    	<B>
    		<B>
    		</B>
    		<B>
    		</B>
    	</B>
    </A>

    Je souhaiterais récupérer la profondeur de l’élément (ou du groupe d'éléments) <B> le(s) plus profond(s) à partir du premier élément <B> ancêtre (qui compte pour 1).

    Dans l'exemple ci-dessus je devrais obtenir 3.

    Le but est de déterminer le nombre de niveaux d'un sommaire.
    La valeur sera utilisée dans un attribut :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:element name="sommaire">		
       <xsl:attribute name="profondeur">3</xsl:attribute>
    </xsl:element>

    Auriez-vous une suggestion ?


  2. #2
    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
    Prendron un élément général comme base, ça peut être A - peu import, dit-on X. On peut faire ceci dans son template.
    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 match="X">
        <xsl:variable name="depth_base" select="count(./ancestor-or-self::*)" />
        <xsl:variable name="max_depth_rel">
            <xsl:for-each select=".//*[not(child::*)]">
                <xsl:sort select="count(ancestor-or-self::*)" data-type="number" />
                <xsl:if test="position()=last()">
                    <xsl:value-of select="count(ancestor-or-self::*) - $depth_base" />
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <!-- etc etc quelque procès comme vous voulez -->
        <xsl:element name="sommaire">		
            <xsl:attribute name="profondeur"><xsl:value-of select="$max_depth_rel" /></xsl:attribute>
        </xsl:element> 
        <!-- etc etc d'autre choses -->
    </xsl:template>

  3. #3
    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
    addendum

    Si vous souhaitez savoir seulement la profondeur maximale de certaine balise, dit-on B, comme descendant, il suffit de changer cette ligne:
    <xsl:for-each select=".//*[not(child::*)]">
    et réécrire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            <xsl:for-each select=".//B[not(child::*)]">

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 313
    Points : 52 905
    Points
    52 905
    Par défaut
    J'ai légèrement adapté votre solution, ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	<xsl:variable name="max_depth_rel">
            <xsl:for-each select="//B">
                <xsl:sort select="count(ancestor-or-self::*)" data-type="number" />
                <xsl:if test="position()=last()">
                    <xsl:value-of select="count(ancestor-or-self::*) - 1" />
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
    Merci infiniment

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

Discussions similaires

  1. [MySQL] Récupérer la valeur Maximale d'un élément
    Par deshogues dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 24/04/2009, 16h25
  2. IA pour un puissance 4 : profondeur maximale ?
    Par Aspic dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 06/12/2008, 20h49
  3. Récupérer dans Flash les valeurs d'éléments d'un formulaire
    Par Mafate dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 15/10/2008, 14h57
  4. [squelette] récupérer les coordonnées maximales
    Par maxence51 dans le forum OpenGL
    Réponses: 1
    Dernier message: 10/06/2008, 12h50
  5. [JDOM] Récupérer tous les attributs d'un élément
    Par ammah dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 21/06/2006, 17h05

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