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 et XPATH 1.0 ]comment trouver le numéro d'ordre d'un élément?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 26
    Points
    26
    Par défaut [XSLT et XPATH 1.0 ]comment trouver le numéro d'ordre d'un élément?
    Bonjour,
    je débute en XSLT et en Xpath (1.0)
    je n'arrive pas à récupérer le numéro d'ordre d'une occurrence d'élément dans un fichier XML.

    Attention, ce n'est pas la position du noeud dans l'arbre que je cherche, car elle est la même pour toutes less occurrences de ce noeud quand j'appelle la fonction position()

    Question
    Y a t-il un moyen de récupérer la place de l'occurrence d'un noeud ?

    EXPLICATION : il s'agit de parcourir un fichier XML et de le recopier dans un autre en changeant TOUTES les valeurs d'un des éléments

    Ex si j'ai dans mon DOCUMENT1 un élément <textSynth> avec 3 occurrences comportant chacune une valeur différente, et dans mon DOCUMENT2 un autre élément <text> avec aussi 3 occurrences, je souhaite obtenir un DOCUMENT3 où j'aurai mis une à une les valeurs de DOCUMENT1/<textSynt> dans DOCUMENT2/<text>.
    Pour cela, il me faut bien accéder à chaque occurrence et pas à la position dans l'arbre seulement, non ?

    Merci de votre aide

    Voici mon document1
    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
    <?xml version="1.0" encoding="ISO-8859-1"?> 
    <SUJET>
    	<made-by>LisaMotion</made-by>
    	<numSuj>03</numSuj>
    	<titreSequ>Martine à la plage</titreSequ>
    	<rubrique></rubrique>
    	<synthe>
    		<numSynth>01</numSynth>
    		<Macro_typeSynth>I</Macro_typeSynth>
    		<nbLignes>3</nbLignes>
    		<textSynth>justice</textSynth>
    		<textSynth>hier</textSynth>
    		<textSynth>Archives</textSynth>
    		<TC_IN></TC_IN>
    		<TC_OUT></TC_OUT>
    	</synthe>
    </SUJET>
    Voici mon document 2
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <ozml version="3.0">
       <factory id="1" uuid="044beba5ad3211d7ac9b000393833f6a">
          <description>Style</description>
     
          <manufacturer>Apple</manufacturer>
     
          <version>1</version>
       </factory>
     
       <factory id="2" uuid="0a5c0b1d4acd11d8b650000a95a6b5a8">
          <description>Channel</description>
     
          <manufacturer>Apple</manufacturer>
     
          <version>1</version>
       </factory>
     
       <scene>
          <sceneSettings>
             <width>720</width>
     
             <height>576</height>
          </sceneSettings>
     
          <layer name="REPERES Info 2008" id="1282331">
             <scenenode name="REPERES " id="1478867" factoryID="9" version="3">
                <validTracks>0</validTracks>
             </scenenode>
          </layer>
     
          <layer name="TITRAGE" id="1274867">
             <layer>
                <scenenode name="Lieu1" id="1283001" factoryID="14" version="3">
    <style name="Style " id="1283004" factoryID="1">
     
    <font type="0">HeldustryFTV-Demi</font>
     
     
     
    </style>
     
                   <styleRun style="1283004" offset="0" length="8" />
     
                   <text>premier texte Ã* insérer</text>
     
                   <object value="112">
                      <parameter name="Crénage" id="1" flags="16" value="0" />
                   </object>
     
                   <object value="114">
                      <parameter name="Crénage" id="2" flags="16" value="0" />
                   </object>
                </scenenode>
     
                <scenenode name="Lieu2" id="1283002" factoryID="14" version="3">
    <style name="Style " id="1283004" factoryID="1">
     
    <font type="0">HeldustryFTV-Demi</font>
     
     
     
    </style>
     
                   <styleRun style="1283004" offset="0" length="8" />
     
                   <text>deuxième texte Ã* insérer</text>
     
                   <object value="112">
                      <parameter name="Crénage" id="1" flags="16" value="0" />
                   </object>
     
                   <object value="114">
                      <parameter name="Crénage" id="2" flags="16" value="0" />
                   </object>
                </scenenode>
     
                <scenenode name="Lieu3" id="1283003" factoryID="14" version="3">
    <style name="Style " id="1283004" factoryID="1">
     
    <font type="0">HeldustryFTV-Demi</font>
     
     
     
    </style>
     
                   <styleRun style="1283004" offset="0" length="8" />
     
                   <text>troisième texte Ã* insérer</text>
     
                   <object value="112">
                      <parameter name="Crénage" id="1" flags="16" value="0" />
                   </object>
     
                   <object value="114">
                      <parameter name="Crénage" id="2" flags="16" value="0" />
                   </object>
                </scenenode>
             </layer>
          </layer>
       </scene>
    </ozml>
    voici ma feuille XSL (1.0) en mode debug

    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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
    	<xsl:output method="xml" encoding="ISO-8859-1" indent="yes" doctype="ozxmlscene" />
     
    	<!-- Copie du document 2 dans un nouveau document 3 -->
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:copy-of select="@*"/>		
    		debug_position_<xsl:value-of select="name()"/> : <xsl:value-of select="position()"/> :
    			<xsl:apply-templates/> 
    		</xsl:copy>
    	</xsl:template> 
     
    	<!-- cas particulier de l'element <text> du document 2 -->
    	<xsl:template match="/ozml/scene/layer/layer/scenenode/text">
    		debug_position_courante_<xsl:value-of select="name()"/> : <xsl:value-of select="position()"/>
    		<xsl:value-of select="/ozml/scene/layer/layer/scenenode/text[position()]"/>
    		<xsl:call-template name="insertion">
    			<xsl:with-param name="compteur" select="1"/>
    		</xsl:call-template>
    	</xsl:template> 
     
    	<!-- on recopie chaque occurence du noeud <textSynth> du document 1 dans l'occurence correspondante du noeud <text> du document 3 -->
    	<xsl:template name="insertion" >
    	<xsl:param name="compteur"/>
    	debug_compteur : <xsl:value-of select="$compteur"/>
    		<xsl:element name="text">
    			<xsl:value-of select="document('document1.xml')/SUJET/synthe/textSynth[$compteur]/text()" />
    		</xsl:element> 
    		<xsl:if test="$compteur &lt; last()">
    			<xsl:call-template name="insertion"> 
    				<xsl:with-param name="compteur" select="$compteur+1"/>
    			</xsl:call-template> 
    		</xsl:if>
    	</xsl:template>
     
    </xsl:stylesheet>
    Merci

  2. #2
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    Excuse moi mais ton explication est un peu flou pour moi peux tu mettre un exemple du fichier xml de sortie que tu désire avoir je pense que ce serait bien plus claire à mon avis
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Oui, voici le fichier résultat attendu :

    les 3 éléments <text> sont remplis,
    le 1er par "justice"
    le 2eme par "hier"
    et le 3eme par "Archives"

    merci

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <ozml version="3.0">
       <factory id="1" uuid="044beba5ad3211d7ac9b000393833f6a">
       <description>Style</description>
     
       .............................</factory>
     
       <scene>
          <sceneSettings>
             <width>720</width>
     
             <height>576</height>
          </sceneSettings>
     
          <layer name="REPERES Info 2008" id="1282331">
             <scenenode name="REPERES 01" id="1478867" factoryID="9" version="3">
                <validTracks>0</validTracks>
             </scenenode>
          </layer>
     
          <layer name="TITRAGE" id="1274867">
             <layer>
                <scenenode name="Lieu1" id="1283001" factoryID="14" version="3">
    				<style name="Style " id="1283004" factoryID="1">                
    						<font type="0">HeldustryFTV-Demi</font>
                   	</style>
                   <styleRun style="1283004" offset="0" length="8" />
     
                   <text>justice</text>
     
                   <object value="112">
                      <parameter name="Crénage" id="1" flags="16" value="0" />
                   </object>
     
                   <object value="114">
                      <parameter name="Crénage" id="2" flags="16" value="0" />
                   </object>
                </scenenode>
     
                <scenenode name="Lieu2" id="1283002" factoryID="14" version="3">
    				<style name="Style " id="1283004" factoryID="1">
                        <font type="0">HeldustryFTV-Demi</font>
    				</style>
                   <styleRun style="1283004" offset="0" length="8" />
     
                   <text>hier</text>
     
                   <object value="112">
                      <parameter name="Crénage" id="1" flags="16" value="0" />
                   </object>
     
                   <object value="114">
                      <parameter name="Crénage" id="2" flags="16" value="0" />
                   </object>
                </scenenode>
     
                <scenenode name="Lieu3" id="1283003" factoryID="14" version="3">
    				<style name="Style " id="1283004" factoryID="1">                    
    					<font type="0">HeldustryFTV-Demi</font>
    				</style>
                   <styleRun style="1283004" offset="0" length="8" />
     
                   <text>Archives</text>
     
                   <object value="112">
                      <parameter name="Crénage" id="1" flags="16" value="0" />
                   </object>
     
                   <object value="114">
                      <parameter name="Crénage" id="2" flags="16" value="0" />
                   </object>
                </scenenode>
             </layer>
          </layer>
       </scene>
    </ozml>

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    J'ai trouvé un contournement, mais ça ne résoud pas cette question.
    dans le Document 2 qui est un modèle je mets des valeurs en dur dans l'élément <text>
    je fais attention d'incrémenter ces valeurs correctement.

    Puis je teste sur les valeurs du noeud text et non sur ses différentes occurrence en les numérotant, du coup, le fichier XSL est bien plus simple.

    Si je ne trouve pas mieux, je vais refaire tous mes modèles comme ça (il y en a 50...) à moins que vous ne me trouviez une astuce (je suis trop nul ou quoi ?)

    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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
    	<xsl:output method="xml" encoding="ISO-8859-1" indent="yes" doctype="ozxmlscene" />
     
    	<!-- Copie du document 2 dans un nouveau document 3 -->
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:copy-of select="@*"/>		
    			<xsl:apply-templates/> 
    		</xsl:copy>
    	</xsl:template> 
     
    	<!-- test autre formule-->
    	<xsl:template match="/ozml/scene/layer/layer/scenenode/text">
    		<xsl:choose>
    			<xsl:when test="./text()=1">
    				<xsl:element name="text">
    					<xsl:value-of select="document('document1.xml')/SUJET/synthe/textSynth[1]/text()" />
    				</xsl:element> 
    			</xsl:when>
     
    			<xsl:when test="./text()=2">
    				<xsl:element name="text">
    					<xsl:value-of select="document('document1.xml')/SUJET/synthe/textSynth[2]/text()" />
    				</xsl:element> 
    			</xsl:when>
     
    			<xsl:when test="./text()=3">
    				<xsl:element name="text">
    					<xsl:value-of select="document('document1.xml')/SUJET/synthe/textSynth[3]/text()" />
    				</xsl:element> 
    			</xsl:when>
    		</xsl:choose>
    	</xsl:template>

  5. #5
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
    	<xsl:output method="xml" encoding="ISO-8859-1" indent="yes" doctype-system="ozxmlscene" />
     
    	<!-- Copie du document 2 dans un nouveau document 3 -->
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:copy-of select="@*"/>		
    		debug_position_<xsl:value-of select="name()"/> : <xsl:value-of select="position()"/> :
    			<xsl:apply-templates/> 
    		</xsl:copy>
    	</xsl:template> 
     
    	<!-- cas particulier de l'element <text> du document 2 -->
    	<xsl:template match="/ozml/scene/layer/layer/scenenode/text">
    		debug_position_courante_<xsl:value-of select="name()"/> : <xsl:value-of select="position()"/>
    		<xsl:value-of select="text()"/>
    		<xsl:call-template name="insertion">
    			<xsl:with-param name="compteur" select="1"/>
    		</xsl:call-template>
    	</xsl:template> 
     
    	<!-- on recopie chaque occurence du noeud <textSynth> du document 1 dans l'occurence correspondante du noeud <text> du document 3 -->
    	<xsl:template name="insertion" >
    	<xsl:param name="compteur"/>
    	debug_compteur : <xsl:value-of select="$compteur"/>
    		<xsl:element name="text">
    			<xsl:value-of select="document('document1.xml')/SUJET/synthe/textSynth[$compteur]/text()" />
    		</xsl:element> 
    		<xsl:if test="$compteur &lt; last()">
    			<xsl:call-template name="insertion"> 
    				<xsl:with-param name="compteur" select="$compteur+1"/>
    			</xsl:call-template> 
    		</xsl:if>
    	</xsl:template>
     
    </xsl:stylesheet>

    regarde pour voir si c'est ce que tu veux
    en fait tu fixais la valeur en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="/ozml/scene/layer/layer/scenenode/text[position()]"/>
    il fallait seulement mettre
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Merci, mais en fait, cela revient à ce que j'avais fait, en plus simple, mais c'est un contournement, text() teste la valeur de l'élément et non sa place dans les différents occurrences.
    Je peux utiliser cette méthode, mais ce n'est pas très propre car je ne maitrise pas toujours la valeur contenu dans l'élément <text>

    Alors que je suis sur des différents occurrences de cet élément <text>

    Question, pourquoi "position()" renvoie toujours le même nombre , dans mon cas : '6' ?

    Merci

Discussions similaires

  1. comment créer un numéro d'ordre sans curseur
    Par cmako dans le forum Développement
    Réponses: 3
    Dernier message: 03/03/2009, 14h09
  2. Comment trouver un numéro de ligne
    Par Mica--> dans le forum Excel
    Réponses: 2
    Dernier message: 13/01/2009, 08h06
  3. Réponses: 3
    Dernier message: 27/10/2007, 09h47
  4. Réponses: 1
    Dernier message: 31/05/2006, 17h59
  5. [CR] Comment trouver un champs dans un report ??
    Par Madduck dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 18/09/2003, 08h31

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