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] calcul du niveau d'un élément


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Points : 93
    Points
    93
    Par défaut [XSLT] calcul du niveau d'un élément
    Bonjour,

    J'ai un fichier xml qui se présente de cette manière :
    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
    <s xml:id="SENT-0" xml:lang="french">
    					<phr function="Subj">
    						<w type="det" lemma="le">Le</w>
    						<w type="adj" lemma="joli">joli</w>
    						<w type="nom" lemma="chat">chat</w>
     
    						<phr function="DO">
    							<w type="pro" lemma="que">que</w>
    						</phr>
     
    						<phr function="Subj">
    							<w type="nom" lemma="je">j'</w>
    						</phr>
     
    						<phr function="predicate">
    							<w type="aux" lemma="avoir">ai</w>
    							<phr function="CC">
    								<w type="adv" lemma="gentiment">gentiment</w>
    							</phr>
    							<w type="partpass" lemma="adopter">adopté</w>
    						</phr>
    					</phr>
    <phr function="predicate">
    						<w type="aux" lemma="avoir">a</w>
    						<phr function="CC" n="1">
    							<w type="adv" lemma="bien">bien</w>
    						</phr>
    						<w type="partpass" lemma="donner">donné</w>
     
    					</phr>
     
    </s>
    j'aimerai pour les élément phr calculer le niveau et selon ce dernier créer un attribut n qui viendrait indiquer l'emplacement du phr.
    exemple : je me situe au premier phr alors j'ai le niveau 0
    je suis au second alors j'ai le niveau 1
    ...
    si je reviens à un noeud dominant alors le niveau reviens à 0...

    Sa devrait donner cela apres transformation :

    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
    <s xml:id="SENT-0" xml:lang="french">
    					<phr function="Subj" n="0">
    						<w type="det" lemma="le">Le</w>
    						<w type="adj" lemma="joli">joli</w>
    						<w type="nom" lemma="chat">chat</w>
     
    						<phr function="DO" n="1">
    							<w type="pro" lemma="que">que</w>
    						</phr>
     
    						<phr function="Subj" n="1">
    							<w type="nom" lemma="je">j'</w>
    						</phr>
     
    						<phr function="predicate" n="1">
    							<w type="aux" lemma="avoir">ai</w>
    							<phr function="CC" n="2">
    								<w type="adv" lemma="gentiment">gentiment</w>
    							</phr>
    							<w type="partpass" lemma="adopter">adopté</w>
    						</phr>
    					</phr>
     
    					<phr function="predicate" n="0">
    						<w type="aux" lemma="avoir">a</w>
    						<phr function="CC" n="1">
    							<w type="adv" lemma="bien">bien</w>
    						</phr>
    						<w type="partpass" lemma="donner">donné</w>
     
    					</phr>

    comment puis je mettre cela en oeuvre en xslt?
    pouvez vous m'aider merci

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    peut être du côté de xsl:number, par contre je n'en vois pas l'intérêt vu que tu dispose déjà de cette information par la structure.
    C'est totalement redondant

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par Erwy Voir le message
    peut être du côté de xsl:number, par contre je n'en vois pas l'intérêt vu que tu dispose déjà de cette information par la structure.
    C'est totalement redondant
    alors en fait je vais transformer mon xml en html et dans un attribut class je vais recuperer ce niveau.

    j'ai un debut de xsl mais sa ne fonctionne pas vraiment :
    je pars d'un xml de ce genre -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="utf-8"?>
    <div>
      <s>
        <phr>
          <phr></phr><phr></phr>  
        </phr>
        <phr>
          <phr></phr><phr></phr>  
        </phr>
     
     </s>
    </div>
    j'ai un xslt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" encoding="utf-8" indent="yes"/>
      <xsl:template match="*">
        <xsl:copy> 
          <xsl:if test="name()='phr'">
    	<!-- format="1" est la valeur par défaut -->
    	<xsl:number level="single" count="phr" format="1"/>
          </xsl:if>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    j'obtien cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="utf-8"?>
    <div>
      <s>
        <phr>11
          <phr>11</phr><phr>22</phr>  
        </phr>
        <phr>22
          <phr>11</phr><phr>22</phr>  
        </phr>
     
     </s>
    </div>
    je ne sais pas pourquoi mais il me met 11 et 22 au lieu de 1 ET 2
    De plus il ne repart pas à 1 pour le second phr mais a 2...

    merci

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par knebhi Voir le message
    alors en fait je vais transformer mon xml en html et dans un attribut class je vais recuperer ce niveau.
    Donc tu transforme ton xml pour le retransformer ensuite en HTML ???

    Je ne suis pas trop , surtout que si tu transforme ton XML en HTML via xslt c'est très simple de directement mettre la valeur dans l'attribut grâce au xpath approprié à base de count et de ancestor, donc pourquoi faire une transformation intermédiaire ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par Erwy Voir le message
    Donc tu transforme ton xml pour le retransformer ensuite en HTML ???

    Je ne suis pas trop , surtout que si tu transforme ton XML en HTML via xslt c'est très simple de directement mettre la valeur dans l'attribut grâce au xpath approprié à base de count et de ancestor, donc pourquoi faire une transformation intermédiaire ?
    je ne fais pas de transformation intermediaire j'ai juste pri un exemple pour ensuite le rajouter a mon code qui est deja fait...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Points : 93
    Points
    93
    Par défaut
    voila un bout de code ou je transforme directement le xml en html avec les niveau :
    phrase.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
    <text>
    		<body>
    			<div type="analyse">
    				<s xml:id="SENT-0" xml:lang="french">
    					<phr function="Subj">
    						<w type="det" lemma="le">Le</w>
    						<w type="adj" lemma="joli">joli</w>
    						<w type="nom" lemma="chat">chat</w>
     
    						<phr function="DO">
    							<w type="pro" lemma="que">que</w>
    						</phr>
     
    						<phr function="Subj">
    							<w type="nom" lemma="je">j'</w>
    						</phr>
     
    						<phr function="predicate">
    							<w type="aux" lemma="avoir">ai</w>
    							<phr function="CC">
    								<w type="adv" lemma="gentiment">gentiment</w>
    							</phr>
    							<w type="partpass" lemma="adopter">adopté</w>
    						</phr>
    					</phr>
    </s>
    </div>
    </body>
    </text>
    transform.xsl
    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
    <xsl:template match="tei:div/tei:s/tei:phr">
     
            <xsl:element name="span">
                <xsl:attribute name="class">
                    <xsl:value-of select="@function"/>
                    <xsl:text>0</xsl:text>
                    <!--     <xsl:value-of select="@n"/> --> 
     
                </xsl:attribute>
     
                <xsl:apply-templates select="node()"/>
            </xsl:element>
        </xsl:template>
     
        <xsl:template match="tei:div/tei:s/tei:phr/tei:phr">
     
            <xsl:element name="span">
                <xsl:attribute name="class">
                    <xsl:value-of select="@function"/>
                    <xsl:text>1</xsl:text>
                    <!--     <xsl:value-of select="@n"/> --> 
     
                </xsl:attribute>
     
                <xsl:apply-templates select="node()"/>
            </xsl:element>
        </xsl:template>
     
        <xsl:template match="tei:div/tei:s/tei:phr/tei:phr/tei:phr">
     
            <xsl:element name="span">
                <xsl:attribute name="class">
                    <xsl:value-of select="@function"/>
                    <xsl:text>2</xsl:text>
                    <!--     <xsl:value-of select="@n"/> --> 
     
                </xsl:attribute>
     
                <xsl:apply-templates select="node()"/>
            </xsl:element>
        </xsl:template>
    comme vous le voyez sa ne calcul pas dynamiquement les niveau mais sa fonctionne tout de meme.

    si vous avez une methode avec une fontion xslt qui ferait sa ou avec un compteur je suis preneur.

    merci

  7. #7
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Soit le XML que je me suis fabriqué
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <text>
    	<body>
    		<div type="analyse" xmlns="truc">
    			<s xml:id="SENT-0" xml:lang="french">
    				<phr function="Subj">
    					<w type="det" lemma="le">Le</w>
    					<w type="adj" lemma="joli">joli</w>
    					<w type="nom" lemma="chat">chat</w>
    					<phr function="DO">
    						<w type="pro" lemma="que">que</w>
    					</phr>
    					<phr function="Subj">
    						<w type="nom" lemma="je">j'</w>
    					</phr>
    					<phr function="predicate">
    						<w type="aux" lemma="avoir">ai</w>
    						<phr function="CC">
    							<w type="adv" lemma="gentiment">gentiment</w>
    						</phr>
    						<w type="partpass" lemma="adopter">adopté</w>
    					</phr>
    				</phr>
    			</s>
    		</div>
    	</body>
    </text>
    Soit mon XSLT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="truc">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="/">
    		<xsl:apply-templates select="text/body/tei:div/tei:s/tei:phr"/>
    	</xsl:template>
    	<xsl:template match="tei:phr">
    		<xsl:element name="span">
    			<xsl:attribute name="class"><xsl:value-of select="concat(@function,count(ancestor::tei:phr))"/></xsl:attribute>
    			<xsl:apply-templates select="node()"/>
    		</xsl:element>
    	</xsl:template>
    	<xsl:template match="text()"></xsl:template>
    </xsl:stylesheet>
    voici mon résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <span class="Subj0">
    	<span class="DO1"/>
    	<span class="Subj1"/>
    	<span class="predicate1">
    		<span class="CC2"/>
    	</span>
    </span>
    C'est bien l'idée ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    330
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 330
    Points : 93
    Points
    93
    Par défaut
    oui c'est bien ça j'ai readapter a mon fichier et j'obtiens sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       <xsl:template match="tei:phr">
            <xsl:element name="span">
                <xsl:attribute name="class">
                    <xsl:value-of select="concat(@function,count(ancestor::tei:phr))"/>
                </xsl:attribute>
                <xsl:apply-templates select="node()"/>
            </xsl:element>
        </xsl:template>
    merci de ton coup de pouce!

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

Discussions similaires

  1. [XSLT] calcul profondeur d'un élément pour certain attribut
    Par knebhi dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/06/2010, 14h20
  2. [XSLT] calculer niveau des noeuds
    Par st0ne dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 28/09/2007, 18h23
  3. [XSLT] Copier un noeud avec ces éléments sauf un
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/10/2006, 13h55
  4. [XSLT][xalan] transformation et renommage d'éléments
    Par bernols dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 18h41
  5. [XSLT] calcul de somme
    Par Mr N. dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 09/09/2005, 12h20

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