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 :

Transformation xsl avec recursif


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
    Février 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 32
    Par défaut Transformation xsl avec recursif
    bonjour,
    je viens de réaliser une transformation xsl avec un récursif me permettant d'ajouter des variables issues d'un xml entre elles.
    Mon problème, c'est que je veux intégrer les résultats du récursif dans mon document xml sans tout mettre dans le récursif, car dés que je veux intégrer des nouvelles balises, le récursif s'applique sur toutes.
    J'essaie d'être le plus clair possible, voici mon xml et mon xsl, le résultat obtenu et le résultat voulu:
    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
    25
    26
    27
    28
    29
    30
    <?xml version="1.0" encoding="utf-8"?>
    <ListeDiffusion Titre="" Version="10">
      <Clip>
     
        <SourceVideo Name="Source1">
          <Fichier>\videoa.avi</Fichier>
         </SourceVideo>
        <SourcePrincipale>1</SourcePrincipale>
        <Debut>1403.59</Debut>
        <Fin>1409.26</Fin>
     
        <Commentaire>bibi</Commentaire>
     
      </Clip>
     
    ..........
     
      <Clip>
     
        <SourceVideo Name="Source1">
          <Fichier>\videob.avi</Fichier>
        </SourceVideo>
        <SourcePrincipale>1</SourcePrincipale>
        <Debut>5929</Debut>
        <Fin>5937.02</Fin>
     
        <Commentaire>bobo</Commentaire>
     
      </Clip>
    </ListeDiffusion>

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <!-- DWXMLSource="testlll.xml" --><xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
     
    <xsl:output omit-xml-declaration="no" media-type="application/xspf+xml"
              method="xml" indent="yes" encoding="UTF-8" />
     
    <xsl:template name="boucle" match="/ListeDiffusion" >
     
    <!-- liste des paramètres -->
    <xsl:param name="n" select="count(/ListeDiffusion/Clip/Debut)"></xsl:param> 
    <xsl:param name="indice" select="0"></xsl:param>
    <xsl:param name="somme_duree" select="0"></xsl:param>
    <!-- On teste si l’indice est supérieur à la limite -->
    <xsl:choose>
     
     
    <xsl:when test="$indice=0">
    <playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
    </playlist>
     
    <xsl:call-template name="boucle">
    <xsl:with-param name="indice"><xsl:value-of select="$indice+1"/>
    </xsl:with-param>
    </xsl:call-template>
    </xsl:when>
     
    <xsl:when test="$indice &gt; $n">
    <!-- instruction à réaliser après la boucle-->
     
    </xsl:when>
     
    <!-- si l’indice est inférieur ou égale à n -->
    <xsl:otherwise>
    <track>
     
      <location><xsl:value-of select="concat('file:///F:\rugby\saison 2012 2013',Clip/SourceVideo/Fichier)"/></location>
      <title><xsl:apply-templates select="Clip[position()=$indice]/Commentaire"/></title>
      <extension application="http://www.videolan.org/vlc/playlist/0">
     
     
      <xsl:element name="vlc">
      <xsl:value-of select="concat('start-time=',$somme_duree)"/>
      </xsl:element>
     
     
    </extension>
      </track>
     
     
    <xsl:call-template name= "boucle">
    <xsl:with-param name="indice"><xsl:value-of select="$indice+1"/>
    <xsl:with-param name="somme_duree" select="number(/ListeDiffusion/Clip[position()=$indice]/Fin)-number(/ListeDiffusion/Clip[position()=$indice]/Debut)+$somme_duree"></xsl:with-param>
    </xsl:with-param>
     
    </xsl:call-template>
     
     
    </xsl:otherwise>
     
    </xsl:choose> 
     
    </xsl:template>
     
    </xsl:stylesheet>
    résultat obtenu 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
    <?xml version="1.0" encoding="UTF-8"?>
    <playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1"/>
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bibi</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc>start-time=0</vlc>
    </extension>
    </track>
     
    ..........
     
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bobo</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc>start-time=46.15000000000009</vlc>
    </extension>
    </track>
    xml voulu:
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <playlist version="1" xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/">
    <trackList>
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bibi</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc:option>start-time=0</vlc:option>
    </extension>
    </track>
     
    ........
     
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bobo</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc:option>start-time=46.15000000000009</vlc:option>
    </extension>
    </track>
    </tracklist>
    pourriez vous m'aider?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne vois pas l'intérêt du récursif. Tu veux un <track> pour chaque <Clip>. Fais un <track> pour chaque <Clip> de la manière habituelle.
    Le récursif ne sert à rien, c'est assez compliqué à la base, et là tu fais vraiment n'importe quoi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 32
    Par défaut pb recursif suite...
    Je crois être obligé de faire un récursif, car je dois ajouter la différence entre la balise <fin> et <debut> comme ceci:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <clip>
    <debut>18</debut>
    <fin>25</fin>
    </clip>
    <clip>
    <debut>251</debut>
    <fin>258</fin>
    </clip>
    <clip>
    <debut>14</debut>
    <fin>28</fin>
    </clip>
    pour arriver à :
    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
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bibi</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc:option>start-time=0</vlc:option>
    </extension>
    </track>
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bibi</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc:option>start-time=7</vlc:option>
    </extension>
    </track>
    <track>
    <location>file:///F:\videoa.avi</location>
    <title>bibi</title>
    <extension application="http://www.videolan.org/vlc/playlist/0">
    <vlc:option>start-time=14</vlc:option>
    </extension>
    </track>

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mouais. C'est vrai que d'habitude ce genre de choses, en 1.0, nécessitent du récursif.
    Mais là tu peux t'en sortir juste à coups de preceding:: et de sum(), ce qui simplifie beaucoup les choses et évite de s'embrouiller.

    Solution avec ton exemple simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:template match="clip">
      <track>
        <location>file</location>
        <xsl:variable name="previous" select="preceding::clip"/>
        <xsl:variable name="start" select="sum($previous/fin) - sum($previous/debut)"/>
        <vlc:option>
          <xsl:value-of select="concat('start-time=', $start)"/>
        </vlc:option>
      </track>
    </xsl:template>
    Et s'il y a d'autres traitements qui, eux, nécessitent vraiment de faire un template récursif pour garder des variables d'un clip à l'autre, voici comment faire sans s'embrouiller les pinceaux :

    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
    <xsl:template match="/">
      <list>
        <xsl:call-template name="clip"/>
      </list>
    </xsl:template>
     
    <xsl:template name="clip">
      <xsl:param name="index" select="1"/>
      <xsl:param name="start" select="0"/>
      <xsl:variable name="clip" select="(//clip)[$index]"/>
      <track>
        <location>file</location>
        <vlc:option>
          <xsl:value-of select="concat('start-time=', $start)"/>
        </vlc:option>
      </track>
      <xsl:if test="count(//clip) > $index">
        <xsl:variable name="length" select="$clip/fin - $clip/debut"/>
        <xsl:call-template name="clip">
          <xsl:with-param name="index" select="$index + 1"/>
          <xsl:with-param name="start" select="$start + $length"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 32
    Par défaut ça ne fonctionne pas
    pardon, mais dans les deux solutions: vlc:option pose probleme, si :option enlevé plus de pb
    par contre sur la première, le résultat ne correspond pas, mais tous les noeuds sont traités
    sur la seconde un seul noeud est traité et le résltat reste tjs le meme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <list>
    <track>
    <location>file</location>
    <vlc>start-time=0</vlc>
    </track>
    </list>

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui, il ne faut pas oublier le xmlns:vlc. Je suggère dans le <xsl:stylesheet> avec les autres xmlns, c'est le plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Transformation XSL avec Java
    Par honesttrick dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 11/11/2014, 15h13
  2. [SAX] [XSLT] Problème transformation XSL avec SAX et namespace
    Par thierry_b dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 17/12/2008, 14h24
  3. [XSLT] transformation xsl avec un fichier xml en utf8
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/12/2008, 10h46
  4. [XSLT]Transformer XSL avec du XSL
    Par belibech dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/07/2007, 15h18
  5. Transformation XSL avec Xalan : MalformedURIException ?
    Par Oscar Hiboux dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 28/03/2006, 01h47

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