Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1486 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  regrouper éléments XSL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

regrouper éléments XSL

n°2314697
chenaff
Posté le 30-04-2018 à 12:35:05  profilanswer
 

Bonjour à tous,
 
je suis étudiante et pour un projet je dois créer à partir d'un XML, un tableau en XSL
 
J'ai assez bien réussie la structure de base, mais je n'arrive pas une étape.
 
Je dois partager mon fichier xml en section, qui correspond à une catégorie "amour", "dispute" ou "autre"
 
je voudrais dans un premier temps un tableau avec une ligne par catégorie et avec toutes les informations qui correspondent regroupées à l'intérieur.
 
Là en l’occurrence au lieu d'avoir une ligne pour chaque, je me retrouve avec des dizaines et des dizaines, autant de fois qu'on retrouve les catégories dans le xml en fait. donc si y'a 20x "dispute" je vais me retrouver avec 20 lignes dispute.
 
Et dans un second temps mes derniers tableaux, j'aimerais retrouver 3 tableaux, un par catégorie, avec encore une fois toutes les informations mais regroupées, et non dans des dizaines de tableaux...
 
voici un extrait de mon xml:
 

Code :
  1. <?xml version="1.0" encoding="UTF8" standalone="yes"?>
  2. <?xml-stylesheet type="text/xsl" href="phonemise-TRS.xsl"?>
  3. <?xml-stylesheet type="text/xsl" href="téléréalité.xsl"?>
  4. <!DOCTYPE Trans SYSTEM "trans-14-corpus.dtd">
  5. <Trans scribe="Amélie" audio_filename="Episode 23" version="15" version_date="180111">
  6.   <Speakers>
  7.     <Speaker id="spk1" name="Nikola" check="no" type="male" dialect="native" accent="" scope="local"/>
  8.     <Speaker id="spk2" name="Fidji" check="no" type="female" dialect="native" accent="" scope="local"/>
  9.     <Speaker id="spk3" name="Kevin" check="no" type="male" dialect="native" accent="" scope="local"/>
  10.     <Speaker id="spk4" name="Anthony" check="no" type="male" dialect="native" accent="" scope="local"/>
  11.     <Speaker id="spk5" name="Carla" check="no" type="female" dialect="native" accent="" scope="local"/>
  12.     <Speaker id="spk6" name="Julien" check="no" type="male" dialect="native" accent="" scope="local"/>
  13.     <Speaker id="spk7" name="Julien2" check="no" type="male" dialect="native" accent="" scope="local"/>
  14.     <Speaker id="spk8" name="Martika" check="no" type="female" dialect="native" accent="" scope="local"/>
  15.     <Speaker id="spk9" name="Haneia" check="no" type="female" dialect="native" accent="" scope="local"/>
  16.     <Speaker id="spk10" name="Maddy" check="no" type="female" dialect="native" accent="" scope="local"/>
  17.     <Speaker id="spk11" name="Jessica" check="no" type="female" dialect="native" accent="" scope="local"/>
  18.     <Speaker id="spk12" name="Jessy" check="no" type="female" dialect="native" accent="" scope="local"/>
  19.     <Speaker id="spk13" name="patron travail" check="no" type="male" dialect="nonnative" accent="" scope="local"/>
  20.   </Speakers>
  21.   <Topics>
  22.     <Topic id="to1" desc="Amour"/>
  23.     <Topic id="to2" desc="Dispute"/>
  24.     <Topic id="to3" desc="Autre"/>
  25.   </Topics>
  26.   <Episode>
  27.      <Section type="report" topic="to3" startTime="1840.624" endTime="1842.287">
  28.       <Turn speaker="spk13" startTime="1840.624" endTime="1842.287">
  29.         <Sync time="1840.624"/>
  30.         <Event desc="es" type="language" >
  31.         <language desc="es">
  32.           <tour nbmots="5" id="000033">
  33.             <motBDL lexeme="" vs="" nbsyll="1" ms="" ABnbsyll="" freq="" phon="ɛl" ABphon="" id="00033000" cat="">el</motBDL>
  34.             <motBDL lexeme="" vs="" nbsyll="3" ms="" ABnbsyll="" freq="" phon="ekipo" ABphon="" id="00033001" cat="">equipo</motBDL>
  35.             <motBDL lexeme="QUE" vs="" nbsyll="1" ms="" ABnbsyll="" freq="***" phon="kə" ABphon="" id="00033002" cat="c">que</motBDL>
  36.             <motBDL lexeme="HA" vs="" nbsyll="1" ms="" ABnbsyll="" freq="2154" phon="a" ABphon="" id="00033003" cat="i">ha</motBDL>
  37.             <motBDL lexeme="" vs="" nbsyll="3" ms="" ABnbsyll="" freq="" phon="ganado" ABphon="" id="00033004" cat="">ganado</motBDL>
  38.           </tour>
  39.         </language>
  40.         </Event>
  41.       </Turn>
  42.     </Section>
  43.     <Section type="nontrans" startTime="1842.287" endTime="1842.775">
  44.       <Turn startTime="1842.287" endTime="1842.775">
  45.         <Sync time="1842.287"/>
  46.       </Turn>
  47.      </Section>
  48.      <Section type="report" topic="to3" startTime="1842.775" endTime="1843.332">
  49.       <Turn speaker="spk13" startTime="1842.775" endTime="1843.332">
  50.         <Sync time="1842.775"/>
  51.         <Event desc="es" type="language" >
  52.         <language desc="es">
  53.           <tour nbmots="1" id="000034">
  54.             <motBDL lexeme="ÊTRE" vs="pi" nbsyll="1" ms="2S" ABnbsyll="" freq="3223650" phon="e" ABphon="" id="00034000" cat="V">es</motBDL>
  55.           </tour>
  56.         </language>
  57.         </Event>
  58.       </Turn>
  59.      </Section>


 
 
et voici mon xsl pour le moment:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:strip-space elements="*"/>
  4. <xsl:output method="html"/>
  5. <xsl:template match="/">
  6.  <html>
  7.   <head>
  8.              <title> Amour ou dispute ? </title>
  9.              <link rel="stylesheet" type="text/css" href="tableaux.css"/> 
  10.             </head>
  11.   <body>
  12.    <p id="sujet"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  13.    <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  14.    <p id="thèmes"> AMOUR VS DISPUTE </p>
  15.    <table>
  16.     <tr>
  17.      <th> Noms des participants </th>
  18.      <th> Genre </th>
  19.     </tr>
  20.     <xsl:for-each select="Trans/Speakers/Speaker">
  21.      <xsl:sort select="@name"/>
  22.      <tr>
  23.       <td> <xsl:value-of select="@name"/> </td>
  24.       <td> <xsl:value-of select="@type"/> </td>
  25.      </tr>
  26.     </xsl:for-each>
  27.    </table>
  28.    <br/>
  29.    <table>
  30.     <tr>
  31.      <th> Sujets de conversation </th>
  32.      <th> Nombre de mots par sujet </th>
  33.      <th> Temps (en min) </th>
  34.      <th> Débit de parole (mots/min) </th>
  35.     </tr>
  36.     <xsl:for-each select="Trans/Episode/Section">
  37.      <xsl:if test="not(@type='nontrans')">
  38.        <xsl:variable name="motspartopic" select="sum(./Turn/tour/@nbmots)"/>
  39.        <xsl:variable name="tempsfin" select="sum(./Turn/@endTime)"/>
  40.        <xsl:variable name="tempsdébut" select="sum(./Turn/@startTime)"/>
  41.        <xsl:variable name="tempspartopic" select="$tempsfin - $tempsdébut"/>
  42.        <xsl:variable name="tempsmin" select="$tempspartopic div 60"/>
  43.        <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  44.       <tr>
  45.        <td> <xsl:call-template name="topicname"/> </td>
  46.        <td> <xsl:value-of select="$motspartopic"/> </td>
  47.        <td> <xsl:value-of select="format-number($tempsmin, '0.0')"/> </td>
  48.        <td> <xsl:value-of select="format-number($calculdébit, '0')"/> </td>
  49.       </tr>
  50.      </xsl:if>
  51.     </xsl:for-each>
  52.    </table>
  53.    <br/>
  54.    <p class="secondepartie"> Tours de parole </p>
  55.    <xsl:for-each select="Trans/Episode/Section">
  56.     <xsl:if test="not(@type='nontrans')">
  57.      <p class="topic"> <xsl:call-template name="topicname"/> </p>
  58.      <table>
  59.       <tr>
  60.        <th> Noms </th>
  61.        <th> Texte </th>
  62.        <th> Temps (en sec) </th>
  63.        <th> Nombre de mots </th>
  64.       </tr>
  65.       <xsl:for-each select="Turn">
  66.        <xsl:if test="normalize-space(@speaker)!='' and normalize-space(.)!=''">
  67.         <tr>
  68.          <td> <xsl:call-template name="speakername"/> </td>
  69.          <td> <xsl:value-of select="."/> </td>
  70.          <td> <xsl:value-of select="format-number(@endTime - @startTime,'0.0')"/> </td>
  71.          <td> <xsl:value-of select="string-length(normalize-space(.))-string-length(translate(normalize-space(.),' ','')) +1"/> </td>
  72.         </tr>
  73.        </xsl:if>
  74.       </xsl:for-each>
  75.      </table>
  76.      <br/>
  77.     </xsl:if>
  78.    </xsl:for-each>
  79.   </body>
  80.  </html>
  81. </xsl:template>
  82. <xsl:template name="speakername">
  83.  <xsl:choose>
  84.   <xsl:when test="(@speaker='spk1')">
  85.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk1']/@name"/>  
  86.   </xsl:when>
  87.   <xsl:when test="(@speaker='spk2')">
  88.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk2']/@name"/>  
  89.   </xsl:when>
  90.   <xsl:when test="(@speaker='spk3')">
  91.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk3']/@name"/>  
  92.   </xsl:when>
  93.   <xsl:when test="(@speaker='spk4')">
  94.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk4']/@name"/>  
  95.   </xsl:when>
  96.   <xsl:when test="(@speaker='spk5')">
  97.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk5']/@name"/>  
  98.   </xsl:when>
  99.   <xsl:when test="(@speaker='spk6')">
  100.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk6']/@name"/>  
  101.   </xsl:when>
  102.   <xsl:when test="(@speaker='spk7')">
  103.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk7']/@name"/>  
  104.   </xsl:when>
  105.   <xsl:when test="(@speaker='spk8')">
  106.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk8']/@name"/>  
  107.   </xsl:when>
  108.   <xsl:when test="(@speaker='spk9')">
  109.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk9']/@name"/>  
  110.   </xsl:when>
  111.   <xsl:when test="(@speaker='spk10')">
  112.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk10']/@name"/>  
  113.   </xsl:when>
  114.   <xsl:when test="(@speaker='spk11')">
  115.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk11']/@name"/>  
  116.   </xsl:when>
  117.   <xsl:when test="(@speaker='spk12')">
  118.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk12']/@name"/>  
  119.   </xsl:when>
  120.   <xsl:when test="(@speaker='spk13')">
  121.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk13']/@name"/>  
  122.   </xsl:when>
  123.   <xsl:when test="(@speaker='spk13')">
  124.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk13']/@name"/>  
  125.   </xsl:when>
  126.   <xsl:otherwise>
  127.    Simultané
  128.   </xsl:otherwise>
  129.  </xsl:choose> 
  130. </xsl:template>
  131. <xsl:template name="topicname">
  132.  <xsl:if test="(@topic='to1')">
  133.   <xsl:value-of select="//Trans/Topics/Topic[@id='to1']/@desc"/>  
  134.  </xsl:if>
  135.  <xsl:if test="(@topic='to2')">
  136.   <xsl:value-of select="//Trans/Topics/Topic[@id='to2']/@desc"/>  
  137.  </xsl:if>
  138.  <xsl:if test="(@topic='to3')">
  139.   <xsl:value-of select="//Trans/Topics/Topic[@id='to3']/@desc"/>  
  140.  </xsl:if>
  141. </xsl:template>
  142. </xsl:stylesheet>

   
 
Si une âme charitable passait par là...
 
J'espère que j'ai été claire pour expliquer le problème.
 
(je précise que je ne suis pas spécialisée en informatique, je n'ai que 10h d'informatique où on a commencé par les bases du html, css etc d'où mon niveau relativement bas. C'est peut être quelque chose de simple à faire de regrouper mais là je nage !)
 
Je vous remercie d'avance.
 

mood
Publicité
Posté le 30-04-2018 à 12:35:05  profilanswer
 

n°2314718
gilou
Modérateur
Modzilla
Posté le 30-04-2018 à 17:39:17  profilanswer
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.   <xsl:strip-space elements="*"/>
  4.   <xsl:output method="html"/>
  5.   <xsl:template match="/">
  6.     <html>
  7.       <head>
  8.         <title> Amour ou dispute ? </title>
  9.         <link rel="stylesheet" type="text/css" href="tableaux.css"/>
  10.       </head>
  11.       <body>
  12.         <p id="sujet"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  13.         <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  14.         <p id="thèmes"> AMOUR VS DISPUTE </p>
  15.         <table>
  16.           <tr>
  17.             <th> Noms des participants </th>
  18.             <th> Genre </th>
  19.           </tr>
  20.           <xsl:for-each select="Trans/Speakers/Speaker">
  21.             <xsl:sort select="@name"/>
  22.             <tr>
  23.               <td> <xsl:value-of select="@name"/> </td>
  24.               <td> <xsl:value-of select="@type"/> </td>
  25.             </tr>
  26.           </xsl:for-each>
  27.         </table>
  28.         <br/>
  29.         <table>
  30.           <tr><th> Sujets de conversation </th><th> Nombre de mots par sujet </th><th> Temps (en min) </th><th> Débit de parole (mots/min) </th></tr>
  31.           <xsl:for-each select="Trans/Episode/Section[not(@type='nontrans')]">
  32.             <xsl:variable name="motspartopic" select="sum(Turn//tour/@nbmots)"/>
  33.             <xsl:variable name="tempspartopic" select="sum(./Turn/@endTime) - sum(Turn/@startTime)"/>
  34.             <xsl:variable name="tempsmin" select="$tempspartopic div 60"/>
  35.             <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  36.               <tr>
  37.                 <td> <xsl:value-of select="//Trans/Topics/Topic[@id=current()/@topic]/@desc"/> </td>
  38.                 <td> <xsl:value-of select="$motspartopic"/> </td>
  39.                 <td> <xsl:value-of select="format-number($tempsmin, '0.0')"/> </td>
  40.                 <td> <xsl:value-of select="format-number($calculdébit, '0')"/> </td>
  41.               </tr>
  42.           </xsl:for-each>
  43.         </table>
  44.         <br/>
  45.         <p class="secondepartie"> Tours de parole </p>
  46.         <xsl:for-each select="Trans/Episode/Section[not(@type='nontrans')]">
  47.           <p class="topic"> <xsl:value-of select="//Trans/Topics/Topic[@id=current()/@topic]/@desc"/> </p>
  48.           <table>
  49.             <!-- header -->
  50.             <tr><th> Noms </th><th> Texte </th><th> Temps (en sec) </th><th> Nombre de mots </th></tr>
  51.             <!-- rows -->
  52.             <xsl:apply-templates  mode="speaker"/>
  53.           </table>
  54.           <br/>
  55.         </xsl:for-each>
  56.       </body>
  57.     </html>
  58.   </xsl:template>
  59.  
  60.  
  61.   <xsl:template match="Turn[normalize-space(@speaker)!=''][normalize-space(.)!='']" mode="speaker">
  62.     <xsl:variable name="speakerinfo" select="//Trans/Speakers/Speaker[@id=current()/@speaker]"/>
  63.       <tr>
  64.         <xsl:choose>
  65.           <xsl:when test="$speakerinfo"><td> <xsl:value-of select="$speakerinfo/@name"/> </td></xsl:when>
  66.           <xsl:otherwise><td> Simultané </td></xsl:otherwise>
  67.         </xsl:choose>
  68.         <td> <xsl:for-each select=".//motBDL"><xsl:value-of select="."/><xsl:text> </xsl:text></xsl:for-each> </td>
  69.         <td> <xsl:value-of select="format-number(@endTime - @startTime,'0.0')"/> </td>
  70.         <td> <xsl:value-of select="count(.//motBDL)"/> </td>
  71.       </tr>
  72.   </xsl:template>
  73.  
  74.   <xsl:template match="*" mode="speaker"/>
  75. </xsl:stylesheet>


Bon, j'ai modifié quelques trucs, je ne sais pas si le résultat est 100% conforme a vos attentes, mais en tout cas, il processe correctement les données maintenant.
 
Sinon, il y a une raison que vous soyez en xsl 1.0? parce que c'est du xsl de l'age de pierre, ça. Essayez au moins de passer en xsl 2.0
la j'ai été obligé d'écrire <td> <xsl:for-each select=".//motBDL"><xsl:value-of select="."/><xsl:text> </xsl:text></xsl:for-each> </td> alors qu'en 2.0 ça aurait été: <td> <xsl:value-of select=".//motBDL"/> </td>
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314720
gilou
Modérateur
Modzilla
Posté le 30-04-2018 à 18:45:30  profilanswer
 

Et la même en xsl 2.0, avec un découpage un peu plus logique:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet
  3.   version="2.0"
  4.   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.  
  6.   <xsl:output method="html"/>
  7.  
  8.   <xsl:strip-space elements="*"/>
  9.  
  10.   <xsl:key name="speaker" match="Speaker" use="@id"/>
  11.   <xsl:key name="topic"   match="Topic"   use="@id"/>
  12.   <xsl:template match="/">
  13.     <html>
  14.       <head>
  15.         <title> Amour ou dispute ? </title>
  16.         <link rel="stylesheet" type="text/css" href="tableaux.css"/>
  17.       </head>
  18.       <body>
  19.         <p id="sujet"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  20.         <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  21.         <p id="thèmes"> AMOUR VS DISPUTE </p>
  22.         <xsl:call-template name="table1"/>
  23.         <br/>
  24.         <xsl:call-template name="table2"/>
  25.         <br/>
  26.         <p class="secondepartie"> Tours de parole </p>
  27.         <xsl:for-each select="Trans/Episode/Section[not(@type='nontrans')]">
  28.           <p class="topic"> <xsl:value-of select="key('topic', @topic)/@desc"/> </p>
  29.           <xsl:call-template name="table3"/>
  30.           <br/>
  31.         </xsl:for-each>
  32.       </body>
  33.     </html>
  34.   </xsl:template>
  35.  
  36.   <xsl:template name="table1">
  37.     <table>
  38.       <!-- header -->
  39.       <tr>
  40.         <th>Noms des participants</th>
  41.         <th>Genre</th>
  42.       </tr>
  43.       <!-- rows -->
  44.       <xsl:for-each select="//Trans/Speakers/Speaker">
  45.         <xsl:sort select="@name"/>
  46.         <tr>
  47.           <td><xsl:value-of select="@name"/></td>
  48.           <td><xsl:value-of select="@type"/></td>
  49.         </tr>
  50.       </xsl:for-each>
  51.     </table>
  52.   </xsl:template>
  53.    
  54.   <xsl:template name="table2">
  55.     <table>
  56.       <!-- header -->
  57.       <tr>
  58.         <th>Sujets de conversation</th>
  59.         <th>Nombre de mots par sujet</th>
  60.         <th>Temps (en min)</th>
  61.         <th>Débit de parole (mots/min)</th>
  62.       </tr>
  63.       <!-- rows -->
  64.       <xsl:for-each select="//Trans/Episode/Section[not(@type='nontrans')]">
  65.         <xsl:variable name="motsParTopic" select="sum(Turn//tour/@nbmots)"/>
  66.         <xsl:variable name="tempsParTopic" select="sum(Turn/@endTime) - sum(Turn/@startTime)"/>
  67.         <tr>
  68.           <td> <xsl:value-of select="key('topic', @topic)/@desc"/> </td>
  69.           <td> <xsl:value-of select="$motsParTopic"/> </td>
  70.           <td> <xsl:value-of select="format-number($tempsParTopic div 60, '0.0')"/> </td>
  71.           <td> <xsl:value-of select="format-number(($motsParTopic * 60) div $tempsParTopic, '0')"/> </td>
  72.         </tr>
  73.       </xsl:for-each>
  74.     </table>
  75.   </xsl:template>
  76.  
  77.   <xsl:template name="table3">
  78.     <table>
  79.       <!-- header -->
  80.       <tr>
  81.         <tr>
  82.           <th>Noms</th>
  83.           <th>Texte</th>
  84.           <th>Temps (en sec)</th>
  85.           <th>Nombre de mots</th>
  86.         </tr>
  87.       </tr>
  88.       <!-- rows -->
  89.       <xsl:for-each select="Turn[normalize-space(@speaker)!=''][normalize-space(.)!='']">
  90.         <xsl:variable name="speaker" select="key('speaker', @speaker)"/>
  91.         <tr>
  92.           <td> <xsl:value-of select="if ($speaker) then $speaker/@name else ' Simultané '"/> </td>
  93.           <td> <xsl:value-of select=".//motBDL"/> </td>
  94.           <td> <xsl:value-of select="format-number(@endTime - @startTime,'0.0')"/> </td>
  95.           <td> <xsl:value-of select="count(.//motBDL)"/> </td>
  96.         </tr>
  97.       </xsl:for-each>
  98.     </table>
  99.   </xsl:template>
  100.  
  101. </xsl:stylesheet>


J'utilise des xsl:key parce que dès que les données vont être volumineuses, les matching comme //Trans/Speakers/Speaker[@id=current()/@speaker] deviennent couteux.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314722
chenaff
Posté le 30-04-2018 à 19:26:53  profilanswer
 

Merci de tes réponses !
 
Alors pour le premier, en l'ouvrant finalement j'avais à peu près le même résultat, ça n'a pas réglé mon problème de regrouper :/
 
Et pour le deuxième, je sais pas pourquoi, mais j'arrive pas à l'ouvrir ça m'affiche une erreur "Erreur lors de la transformation XLST : Évaluation d’une expression invalide."
 
Et au sujet de la version qui date de l'antiquité haha, écoutes, le prof nous a donné quelques exemples dans nos cours et on faisait que suivre ce qui était écrit donc on ne sait pas vraiment pourquoi, et les différences des versions en gros.
 
En attendant tes réponses je continuais à essayer de trouver des réponses,
j'ai réussi un truc un peu mieux, mais il me manque toujours quelque chose.  
Au lieu de regrouper, j'avais pensé à simplement faire un total pour chaque catégorie.
 
                                         DISPUTE
Nombre de mots  Temps (en sec)      Débit de parole (mots/min)
         24                             8.4                           280
          3                          1.6                          113
         56                          9.3                          362
Total ?                         Total ?           Moyenne du débit ?
 
Pour l'instant ça ressemble à ça, mais je sais pas comment faire le total du nombre de mots et du temps pour chaque catégorie, et encore moins la moyenne du débit.
 
J'ai modifié quelques ptites choses, comme les topics, que j'ai remplacé par id en mettant directement "amour", "dispute", ou "autre" pour que le chemin dans le xsl soit un peu plus simple.
 

Code :
  1. <?xml version="1.0" encoding="UTF8" standalone="yes"?>
  2. <?xml-stylesheet type="text/xsl" href="phonemise-TRS.xsl"?>
  3. <?xml-stylesheet type="text/xsl" href="téléréalité - 3.xsl"?>
  4. <!DOCTYPE Trans SYSTEM "trans-14-corpus.dtd">
  5. <Trans scribe="Amélie" audio_filename="Episode 16" version="23" version_date="180111">
  6.   <Speakers>
  7.     <Speaker id="spk1" name="Martika" check="no" type="female" dialect="native" accent="" scope="local"/>
  8.     <Speaker id="spk2" name="Matthieu" check="no" type="male" dialect="native" accent="" scope="local"/>
  9.     <Speaker id="spk3" name="Nikola" check="no" type="male" dialect="native" accent="" scope="local"/>
  10.     <Speaker id="spk4" name="Fidji" check="no" type="female" dialect="native" accent="" scope="local"/>
  11.     <Speaker id="spk5" name="Maddy" check="no" type="female" dialect="native" accent="" scope="local"/>
  12.     <Speaker id="spk6" name="Anthony" check="no" type="male" dialect="native" accent="" scope="local"/>
  13.     <Speaker id="spk7" name="Adixia" check="no" type="female" dialect="native" accent="" scope="local"/>
  14.     <Speaker id="spk8" name="Kevin" check="no" type="male" dialect="native" accent="" scope="local"/>
  15.     <Speaker id="spk9" name="Jessica" check="no" type="female" dialect="native" accent="" scope="local"/>
  16.     <Speaker id="spk10" name="Julien" check="no" type="male" dialect="native" accent="" scope="local"/>
  17.     <Speaker id="spk11" name="Jessy" check="no" type="female" dialect="native" accent="" scope="local"/>
  18.     <Speaker id="spk12" name="Haneia" check="no" type="female" dialect="native" accent="" scope="local"/>
  19.     <Speaker id="spk13" name="David" check="no" type="male" dialect="native" accent="" scope="local"/>
  20.     <Speaker id="spk14" name="Agent Immobilier" check="no" type="female" dialect="nonnative" accent="" scope="local"/>
  21.   </Speakers>
  22.   <Episode>
  23.     <Section type="nontrans" startTime="0" endTime="361.552">
  24.       <Turn startTime="0" endTime="12.314">
  25.         <Sync time="0"/>
  26.       </Turn>
  27.   </Section>
  28.   <Section type="report" id="Autre" startTime="12.314" endTime="27.172">
  29.       <Turn speaker="spk1" startTime="12.314" endTime="13.594">
  30.         <Sync time="12.314"/>
  31.         <tour nbmots="2" id="000000">
  32.           <motBDL lexeme="NOUS" vs="" nbsyll="1" ms="iP1" ABnbsyll="" freq="***" phon="nu" ABphon="" id="00000000" cat="P">nous</motBDL>
  33.           <motBDL lexeme="VOILÀ" vs="" nbsyll="2" ms="" ABnbsyll="" freq="72644" phon="vwala" ABphon="" id="00000001" cat="p">voilà</motBDL>
  34.         </tour>
  35.       </Turn>
  36.       <Turn startTime="13.594" endTime="14.636">
  37.         <Sync time="13.594"/>
  38.       </Turn>
  39.       <Turn speaker="spk2" startTime="14.636" endTime="15.855">
  40.         <Sync time="14.636"/>
  41.         <tour nbmots="4" id="000001">
  42.           <motBDL lexeme="TE" vs="" nbsyll="1" ms="iS2" ABnbsyll="" freq="***" phon="tə" ABphon="" id="00001000" cat="P">te</motBDL>
  43.           <motBDL lexeme="REVOILÀ" vs="" nbsyll="3" ms="" ABnbsyll="" freq="756" phon="ʁəvwala" ABphon="" id="00001001" cat="p">revoilà</motBDL>
  44.           <motBDL lexeme="PETIT" vs="" nbsyll="2" ms="MS" ABnbsyll="" freq="110680" phon="pəti" ABphon="" id="00001002" cat="G">petit</motBDL>
  45.           <motBDL lexeme="PONEY" vs="" nbsyll="2" ms="MS" ABnbsyll="" freq="480" phon="pone" ABphon="" id="00001003" cat="N">poney</motBDL>
  46.         </tour>
  47.       </Turn>
  48.       <Turn startTime="15.855" endTime="16.99">
  49.         <Sync time="15.855"/>
  50.       </Turn>
  51.       <Turn speaker="spk3" startTime="16.99" endTime="25.586">
  52.         <Sync time="16.99"/>
  53.         <tour connecteurs="et" nbmots="24" id="000002">
  54.           <motBDL lexeme="ON" vs="" nbsyll="1" ms="iS3" ABnbsyll="" freq="***" phon="ɔ̃" ABphon="" id="00002000" cat="P">on</motBDL>
  55.           <motBDL lexeme="RENTRER" vs="ps" nbsyll="1" ms="3S" ABnbsyll="" freq="53251" phon="ʁɑ̃tʁ" ABphon="" id="00002001" cat="V">rent'</motBDL>
  56.           <motBDL lexeme="DE" vs="" nbsyll="1" ms="" ABnbsyll="" freq="2522086" phon="də" ABphon="" id="00002002" cat="p">de</motBDL>
  57.           <motBDL lexeme="LE" vs="sd" nbsyll="0" ms="MS3" ABnbsyll="" freq="***" phon="l" ABphon="" id="00002003" cat="P">l'</motBDL>
  58.           <motBDL lexeme="ACTIVITÉ" vs="" nbsyll="4" ms="FS" ABnbsyll="" freq="2347" phon="aktivite" ABphon="" id="00002004" cat="N">activité</motBDL>
  59.           <motBDL lexeme="BOUÉE" vs="" nbsyll="2" ms="FS" ABnbsyll="" freq="204" phon="bue" ABphon="" id="00002005" cat="N">bouée</motBDL>
  60.           <motBDL lexeme="MOI" vs="st" nbsyll="1" ms="iS1" ABnbsyll="" freq="***" phon="mwa" ABphon="" id="00002006" cat="P">moi</motBDL>
  61.           <motBDL lexeme="CLAIREMENT" vs="Ma" nbsyll="3" ms="" ABnbsyll="" freq="1875" phon="kleʁəmɑ̃" ABphon="" id="00002007" cat="A">clair'ment</motBDL>
  62.           <motBDL lexeme="JE" vs="ss" nbsyll="1" ms="iS1" ABnbsyll="" freq="***" phon="ʒə" ABphon="" id="00002008" cat="P">j'</motBDL>
  63.           <motBDL lexeme="SUIVRE" vs="pI" nbsyll="1" ms="2S" ABnbsyll="" freq="209054" phon="sɥi" ABphon="" id="00002009" cat="V">su'</motBDL>
  64.           <motBDL lexeme="PAS" vs="Ng" nbsyll="1" ms="" ABnbsyll="" freq="1818815" phon="pa" ABphon="" id="00002010" cat="A">pas</motBDL>
  65.           <motBDL lexeme="BIEN" vs="" nbsyll="1" ms="ij" ABnbsyll="" freq="3429" phon="bjɛ̃" ABphon="" id="00002011" cat="Adj">bien</motBDL>
  66.           <motBDL lexeme="ON" vs="" nbsyll="1" ms="iS3" ABnbsyll="" freq="***" phon="ɔ̃n" ABphon="" id="00002012" cat="P">on</motBDL>
  67.           <motBDL lexeme="AVOIR" vs="pi" nbsyll="1" ms="3S" ABnbsyll="" freq="1357258" phon="a" ABphon="" id="00002013" cat="V">a</motBDL>
  68.           <motBDL lexeme="AVOIR" vs="" nbsyll="1" ms="MS" ABnbsyll="" freq="***" phon="y" ABphon="" id="00002014" cat="Adj">eu</motBDL>
  69.           <motBDL lexeme="UNE" vs="" nbsyll="2" ms="FS" ABnbsyll="" freq="***" phon="ynə" ABphon="" id="00002015" cat="d">une</motBDL>
  70.           <motBDL lexeme="GROSSE" vs="" nbsyll="1" ms="FS" ABnbsyll="" freq="***" phon="gʁos" ABphon="" id="00002016" cat="N">grosse</motBDL>
  71.           <motBDL lexeme="DISCUSSION" vs="" nbsyll="3" ms="FS" ABnbsyll="" freq="2358" phon="diskysjɔ̃" ABphon="" id="00002017" cat="N">discussion</motBDL>
  72.           <motBDL lexeme="AVEC" vs="" nbsyll="2" ms="" ABnbsyll="" freq="370489" phon="avɛk" ABphon="" id="00002018" cat="p">avec</motBDL>
  73.           <motBDL lexeme="" vs="" nbsyll="2" ms="" ABnbsyll="" freq="" phon="fidʒi" ABphon="" id="00002019" cat="">fidji</motBDL>
  74.           <motBDL lexeme="ET" vs="cc" nbsyll="1" ms="" ABnbsyll="" freq="1290908" phon="e" ABphon="" id="00002020" cat="c">et</motBDL>
  75.           <motBDL lexeme="Y" vs="" nbsyll="1" ms="003" ABnbsyll="" freq="***" phon="i" ABphon="" id="00002021" cat="P">y</motBDL>
  76.           <motBDL lexeme="AVOIR" vs="pi" nbsyll="1" ms="3S" ABnbsyll="" freq="1357258" phon="a" ABphon="" id="00002022" cat="V">a</motBDL>
  77.           <motBDL lexeme="PLEIN" vs="" nbsyll="1" ms="" ABnbsyll="" freq="8911" phon="plɛ̃" ABphon="" id="00002023" cat="p">plein</motBDL>
  78.         </tour>
  79.         <Event desc="dys" type="entities">
  80.         <entities desc="dys">
  81.           <tour nbmots="3" id="000004">
  82.             <motBDL lexeme="DE" vs="" nbsyll="1" ms="" ABnbsyll="" freq="2522086" phon="də" ABphon="" id="00004000" cat="p">de</motBDL>
  83.             <motBDL lexeme="DE" vs="" nbsyll="1" ms="" ABnbsyll="" freq="2522086" phon="də" ABphon="" id="00004001" cat="p">de</motBDL>
  84.             <motBDL lexeme="DE" vs="" nbsyll="1" ms="" ABnbsyll="" freq="2522086" phon="də" ABphon="" id="00004002" cat="p">de</motBDL>
  85.           </tour>
  86.         </entities>
  87.         </Event>
  88.         <tour nbmots="9" id="000006">
  89.           <motBDL lexeme="QUESTION" vs="" nbsyll="2" ms="FP" ABnbsyll="" freq="41182" phon="kɛsjɔ̃" ABphon="" id="00006000" cat="N">questions</motBDL>
  90.           <motBDL lexeme="QUI" vs="" nbsyll="1" ms="ij3" ABnbsyll="" freq="***" phon="ki" ABphon="" id="00006001" cat="P">qui</motBDL>
  91.           <motBDL lexeme="GERMER" vs="ps" nbsyll="1" ms="3P" ABnbsyll="" freq="102" phon="ʒɛʁm" ABphon="" id="00006002" cat="V">germent</motBDL>
  92.           <motBDL lexeme="DANS" vs="" nbsyll="1" ms="" ABnbsyll="" freq="465859" phon="dɑ̃" ABphon="" id="00006003" cat="p">dans</motBDL>
  93.           <motBDL lexeme="MON" vs="dp" nbsyll="1" ms="MS1S" ABnbsyll="" freq="***" phon="mɔ̃n" ABphon="" id="00006004" cat="d">mon</motBDL>
  94.           <motBDL lexeme="ESPRIT" vs="" nbsyll="2" ms="MS" ABnbsyll="" freq="15582" phon="ɛspʁi" ABphon="" id="00006005" cat="N">esprit</motBDL>
  95.           <motBDL lexeme="DANS" vs="" nbsyll="1" ms="" ABnbsyll="" freq="465859" phon="dɑ̃" ABphon="" id="00006006" cat="p">dans</motBDL>
  96.           <motBDL lexeme="MA" vs="dp" nbsyll="1" ms="FS1S" ABnbsyll="" freq="***" phon="ma" ABphon="" id="00006007" cat="d">ma</motBDL>
  97.           <motBDL lexeme="TÊTE" vs="" nbsyll="1" ms="FS" ABnbsyll="" freq="47587" phon="tɛt" ABphon="" id="00006008" cat="N">tête</motBDL>
  98.         </tour>
  99.       </Turn>
  100.       <Turn startTime="25.586" endTime="25.884">
  101.         <Sync time="25.586"/>
  102.       </Turn>
  103.       <Turn speaker="spk3" startTime="25.884" endTime="26.82">
  104.         <Sync time="25.884"/>
  105.         <tour nbmots="5" id="000007">
  106.           <motBDL lexeme="JE" vs="ss" nbsyll="1" ms="iS1" ABnbsyll="" freq="***" phon="ʒə" ABphon="" id="00007000" cat="P">j'</motBDL>
  107.           <motBDL lexeme="SUIVRE" vs="pI" nbsyll="1" ms="2S" ABnbsyll="" freq="209054" phon="sɥi" ABphon="" id="00007001" cat="V">su'</motBDL>
  108.           <motBDL lexeme="UN" vs="do" nbsyll="1" ms="ij" ABnbsyll="" freq="***" phon="œ̃" ABphon="" id="00007002" cat="d">un</motBDL>
  109.           <motBDL lexeme="PEU" vs="Qt" nbsyll="1" ms="" ABnbsyll="" freq="25097" phon="pø" ABphon="" id="00007003" cat="A">peu</motBDL>
  110.           <motBDL lexeme="PERDU" vs="" nbsyll="2" ms="MS" ABnbsyll="" freq="3646" phon="pɛʁdy" ABphon="" id="00007004" cat="M">perdu</motBDL>
  111.         </tour>
  112.       </Turn>
  113.       <Turn startTime="26.82" endTime="27.172">
  114.         <Sync time="26.82"/>
  115.       </Turn>
  116.    </Section>


 
 
Et voici le nouveau xsl:
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:strip-space elements="*"/>
  4. <xsl:output method="html"/>
  5. <xsl:key name="regrouper" match="Section" use="@id"/>
  6. <xsl:template match="/">
  7.  <html>
  8.   <head>
  9.              <title> Amour ou dispute ? </title>
  10.              <link rel="stylesheet" type="text/css" href="tableaux.css"/> 
  11.             </head>
  12.   <body>
  13.    <p id="sujetcorpus"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  14.    <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  15.    <p id="vs"> AMOUR VS DISPUTE </p>
  16.    <table>
  17.     <tr>
  18.      <th> Noms des participants </th>
  19.      <th> Genre </th>
  20.     </tr>
  21.     <xsl:for-each select="Trans/Speakers/Speaker">
  22.      <xsl:sort select="@name"/>
  23.      <tr>
  24.       <td> <xsl:value-of select="@name"/> </td>
  25.       <td> <xsl:value-of select="@type"/> </td>
  26.      </tr>
  27.     </xsl:for-each>
  28.    </table>
  29.    <br/>
  30.    <p class="thèmes"> AMOUR </p>
  31.    <table>
  32.     <tr>
  33.      <th> Nombre de mots </th>
  34.      <th> Temps (en sec) </th>
  35.      <th> Débit de parole (mots/min) </th>
  36.     </tr>
  37.     <xsl:for-each select="key('regrouper','Amour')">
  38.      <xsl:if test="not(@type='nontrans')">
  39.        <xsl:variable name="motspartopic" select="sum(./Turn/tour/@nbmots)"/>
  40.        <xsl:variable name="tempspartopic" select="sum(./Turn/@endTime) - sum(Turn/@startTime)"/>
  41.        <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  42.       <tr>
  43.        <td> <xsl:value-of select="$motspartopic"/> </td>
  44.        <td> <xsl:value-of select="format-number($tempspartopic, '0.0')"/> </td>
  45.        <td> <xsl:value-of select="format-number($calculdébit, '0')"/> </td>
  46.       </tr>
  47.      </xsl:if>
  48.     </xsl:for-each>
  49.    </table>
  50.    <br/>
  51.    <p class="thèmes"> DISPUTE </p>
  52.    <table>
  53.     <tr>
  54.      <th> Nombre de mots </th>
  55.      <th> Temps (en sec) </th>
  56.      <th> Débit de parole (mots/min) </th>
  57.     </tr>
  58.     <xsl:for-each select="key('regrouper','Dispute')">
  59.      <xsl:if test="not(@type='nontrans')">
  60.        <xsl:variable name="motspartopic" select="sum(./Turn/tour/@nbmots)"/>
  61.        <xsl:variable name="tempspartopic" select="sum(./Turn/@endTime) - sum(Turn/@startTime)"/>
  62.        <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  63.       <tr>
  64.        <td> <xsl:value-of select="$motspartopic"/> </td>
  65.        <td> <xsl:value-of select="format-number($tempspartopic, '0.0')"/> </td>
  66.        <td> <xsl:value-of select="format-number($calculdébit, '0')"/> </td>
  67.       </tr>
  68.      </xsl:if>
  69.     </xsl:for-each>
  70.     <tr>
  71.      <th> Total nombre de mots </th>
  72.      <th> Total temps </th>
  73.      <th> Moyenne débit </th>
  74.     </tr>
  75.    </table>
  76.    <br/>
  77.    <p class="thèmes"> AUTRE </p>
  78.    <table>
  79.     <tr>
  80.      <th> Nombre de mots </th>
  81.      <th> Temps (en sec) </th>
  82.      <th> Débit de parole (mots/min) </th>
  83.     </tr>
  84.     <xsl:for-each select="key('regrouper','Autre')">
  85.      <xsl:if test="not(@type='nontrans')">
  86.        <xsl:variable name="motspartopic" select="sum(./Turn/tour/@nbmots)"/>
  87.        <xsl:variable name="tempspartopic" select="sum(./Turn/@endTime) - sum(Turn/@startTime)"/>
  88.        <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  89.       <tr>
  90.        <td> <xsl:value-of select="$motspartopic"/> </td>
  91.        <td> <xsl:value-of select="format-number($tempspartopic, '0.0')"/> </td>
  92.        <td> <xsl:value-of select="format-number($calculdébit, '0')"/> </td>
  93.       </tr>
  94.      </xsl:if>
  95.     </xsl:for-each>
  96.    </table>
  97.    <br/>
  98.    <p class="secondepartie"> Tours de parole </p>
  99.    <xsl:for-each select="Trans/Episode/Section">
  100.     <xsl:if test="not(@type='nontrans')">
  101.      <p class="topic"> <xsl:value-of select="@id"/> </p>
  102.      <table>
  103.       <tr>
  104.        <th> Noms </th>
  105.        <th> Texte </th>
  106.        <th> Temps (en sec) </th>
  107.        <th> Nombre de mots </th>
  108.       </tr>
  109.       <xsl:for-each select="Turn">
  110.        <xsl:if test="normalize-space(@speaker)!='' and normalize-space(.)!=''">
  111.         <tr>
  112.          <td> <xsl:call-template name="speakername"/> </td>
  113.          <td> <xsl:value-of select="."/> </td>
  114.          <td> <xsl:value-of select="format-number(@endTime - @startTime,'0.0')"/> </td>
  115.          <td> <xsl:value-of select="string-length(normalize-space(.))-string-length(translate(normalize-space(.),' ','')) +1"/> </td>
  116.         </tr>
  117.        </xsl:if>
  118.       </xsl:for-each>
  119.      </table>
  120.      <br/>
  121.     </xsl:if>
  122.    </xsl:for-each>
  123.   </body>
  124.  </html>
  125. </xsl:template>
  126. <xsl:template name="speakername">
  127.  <xsl:choose>
  128.   <xsl:when test="(@speaker='spk1')">
  129.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk1']/@name"/>  
  130.   </xsl:when>
  131.   <xsl:when test="(@speaker='spk2')">
  132.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk2']/@name"/>  
  133.   </xsl:when>
  134.   <xsl:when test="(@speaker='spk3')">
  135.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk3']/@name"/>  
  136.   </xsl:when>
  137.   <xsl:when test="(@speaker='spk4')">
  138.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk4']/@name"/>  
  139.   </xsl:when>
  140.   <xsl:when test="(@speaker='spk5')">
  141.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk5']/@name"/>  
  142.   </xsl:when>
  143.   <xsl:when test="(@speaker='spk6')">
  144.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk6']/@name"/>  
  145.   </xsl:when>
  146.   <xsl:when test="(@speaker='spk7')">
  147.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk7']/@name"/>  
  148.   </xsl:when>
  149.   <xsl:when test="(@speaker='spk8')">
  150.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk8']/@name"/>  
  151.   </xsl:when>
  152.   <xsl:when test="(@speaker='spk9')">
  153.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk9']/@name"/>  
  154.   </xsl:when>
  155.   <xsl:when test="(@speaker='spk10')">
  156.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk10']/@name"/>  
  157.   </xsl:when>
  158.   <xsl:when test="(@speaker='spk11')">
  159.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk11']/@name"/>  
  160.   </xsl:when>
  161.   <xsl:when test="(@speaker='spk12')">
  162.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk12']/@name"/>  
  163.   </xsl:when>
  164.   <xsl:when test="(@speaker='spk13')">
  165.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk13']/@name"/>  
  166.   </xsl:when>
  167.   <xsl:when test="(@speaker='spk13')">
  168.    <xsl:value-of select="//Trans/Speakers/Speaker[@id='spk13']/@name"/>  
  169.   </xsl:when>
  170.   <xsl:otherwise>
  171.    Simultané
  172.   </xsl:otherwise>
  173.  </xsl:choose> 
  174. </xsl:template>
  175. </xsl:stylesheet>


 
Si tu pouvais m'aider au moins pour les totaux et moyenne, ce serait parfait, en comparant avec ce que tu m'as montré, je vois bien que je suis pas au niveau haha  
et le prof s'en rendra aussi forcément compte d'ailleurs :sweat:


Message édité par chenaff le 30-04-2018 à 19:40:34
n°2314725
gilou
Modérateur
Modzilla
Posté le 30-04-2018 à 21:04:17  profilanswer
 

Citation :

Alors pour le premier, en l'ouvrant finalement j'avais à peu près le même résultat, ça n'a pas réglé mon problème de regrouper :/
 
Et pour le deuxième, je sais pas pourquoi, mais j'arrive pas à l'ouvrir ça m'affiche une erreur "Erreur lors de la transformation XLST : Évaluation d’une expression invalide.

Je ne sais pas avec quoi tu exécutes le xsl, mais clairement avec des outils pas au top, puisque les feuilles de style que je t'ai données sont 100% valides (J'utilise un éditeur pro, qui valide la syntaxe, le xsl, c'est un aspect important de mon travail quotidien). Pour le 2e, c'est probablement que tes outils ne supportent pas xsl 2.0 et ne vérifient pas la version de la feuille. Ça doit être le select="if () then {} else {}" venant du xquery qui lui plait pas.
 
Pour le premier, il faudrait que tu expliques clairement ce que tu veux faire.
Tu veux les totaux et moyennes de quoi? regroupés comment?
 
Edit: je viens de regarder les données. Première fois que j'en ai avec de l'IPA dedans.
 
A+,

Message cité 1 fois
Message édité par gilou le 30-04-2018 à 21:12:30

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314732
chenaff
Posté le 30-04-2018 à 23:38:06  profilanswer
 

gilou a écrit :

Citation :

Alors pour le premier, en l'ouvrant finalement j'avais à peu près le même résultat, ça n'a pas réglé mon problème de regrouper :/
 
Et pour le deuxième, je sais pas pourquoi, mais j'arrive pas à l'ouvrir ça m'affiche une erreur "Erreur lors de la transformation XLST : Évaluation d’une expression invalide.

Je ne sais pas avec quoi tu exécutes le xsl, mais clairement avec des outils pas au top, puisque les feuilles de style que je t'ai données sont 100% valides (J'utilise un éditeur pro, qui valide la syntaxe, le xsl, c'est un aspect important de mon travail quotidien). Pour le 2e, c'est probablement que tes outils ne supportent pas xsl 2.0 et ne vérifient pas la version de la feuille. Ça doit être le select="if () then {} else {}" venant du xquery qui lui plait pas.
 
Pour le premier, il faudrait que tu expliques clairement ce que tu veux faire.
Tu veux les totaux et moyennes de quoi? regroupés comment?
 
Edit: je viens de regarder les données. Première fois que j'en ai avec de l'IPA dedans.
 
A+,


 
Je voulais montrer un screen mais je crois qu'on peut pas ajouter d'image directement ici.
En gros dans mon xsl pour le moment ça me donne un résultat de ce type:
 
                                         AMOUR  
Nombre de mots  Temps (en sec)      Débit de parole (mots/min)  
55                         14.5                         227
42                         7.7                         329
43                         10.6                          244
327                         85.1                         231
77                         17.3                         268
38                         9.9                         231
119                         32.9                         217
27                         5.6                         291
84                         21.3                         236
108                         27.1                         239
166                         47.7                         209
36                         8.7                         249
57                         14.5                         237
237                         59.9                         237
35                          8.9                         236
 
                                         DISPUTE  
Nombre de mots  Temps (en sec)      Débit de parole (mots/min)  
         24                      8.4                         280  
          3                       1.6                        113  
         56                      9.3                        362  
 
                                         AUTRE  
Nombre de mots  Temps (en sec)      Débit de parole (mots/min)  
         15                             8.4                       210  
          9                              5                         150  
         140                           9.3                       500
 
 
Pour chaque thème, j'ai un tableau, avec le nombre de mots par section, le temps, et le débit de parole comme ci dessus.
Et je voudrais rajouter une ligne à la fin de chaque tableau avec les totaux du nombre de mots, du temps, et la moyenne du débit de parole
ou sinon refaire un tableau à part avec les informations pour chaque dans le style:
 
thèmes     |     total nombre de mots par thème           total temps par thème                  moyenne du débit de parole par thème
_______________________________________________________________________________________________________
amour      |                          ?                                              ?                                                                 ?
dispute     |                          ?                                              ?                                                                 ?
autre        |                          ?                                              ?                                                                 ?
 
remplacer les "?" par les valeurs qui correspondent du coup.
 
Le prof nous a toujours dit d'ouvrir les fichiers xsl et xsl sous notepad++ et après je vérifie le rendu sur Firefox
 
Alors je me doutais bien que le code que vous m'avez donné était bon, mais impossible pour moi de l'utiliser...


Message édité par chenaff le 30-04-2018 à 23:45:35
n°2314733
gilou
Modérateur
Modzilla
Posté le 30-04-2018 à 23:43:04  profilanswer
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet
  3.   version="1.0"
  4.   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.  
  6.   <xsl:strip-space elements="*"/>
  7.  
  8.   <xsl:output method="html"/>
  9.  
  10.   <xsl:key name="regrouper" match="Section" use="@id"/>
  11.   <xsl:key name="speaker" match="Speaker" use="@id"/>
  12.  
  13.   <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
  14.   <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
  15.  
  16.   <xsl:template match="/">
  17.     <xsl:apply-templates />
  18.   </xsl:template>
  19.  
  20.   <xsl:template match="Trans">
  21.     <html>
  22.       <head>
  23.         <title> Amour ou dispute ? </title>
  24.         <link rel="stylesheet" type="text/css" href="tableaux.css"/>
  25.       </head>
  26.       <body>
  27.         <p id="sujetcorpus"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  28.         <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  29.         <p id="vs"> AMOUR VS DISPUTE </p>
  30.         <xsl:apply-templates select="Speakers"/>
  31.         <br/>
  32.         <xsl:call-template name="recursiveThemes">
  33.           <xsl:with-param name="themesList" select="'Amour Dispute Autre'"/>
  34.           <xsl:with-param name="delimiter" select="' '"/>
  35.         </xsl:call-template>
  36.         <p class="secondepartie"> Tours de parole </p>
  37.         <xsl:apply-templates select="Episode/Section[not(@type = 'nontrans')]"/>
  38.       </body>
  39.     </html>
  40.   </xsl:template>
  41.  
  42.   <xsl:template match="Speakers">
  43.     <table>
  44.       <tr>
  45.         <th> Noms des participants </th>
  46.         <th> Genre </th>
  47.       </tr>
  48.       <xsl:for-each select="Speaker">
  49.         <xsl:sort select="@name"/>
  50.         <tr>
  51.           <td>
  52.             <xsl:value-of select="@name"/>
  53.           </td>
  54.           <td>
  55.             <xsl:value-of select="@type"/>
  56.           </td>
  57.         </tr>
  58.       </xsl:for-each>
  59.     </table>
  60.   </xsl:template>
  61.  
  62.   <xsl:template name="recursiveThemes">
  63.     <xsl:param name="themesList"/>
  64.     <xsl:param name="delimiter"/>
  65.     <xsl:choose>
  66.       <xsl:when test="contains($themesList, $delimiter)">
  67.         <!-- On a un délimiteur, donc liste a plus d'un terme -->
  68.         <!-- On traite le premier terme de la liste -->
  69.         <xsl:call-template name="Theme">
  70.           <xsl:with-param name="theme" select="substring-before($themesList, $delimiter)"/>
  71.         </xsl:call-template>
  72.         <!-- et on appelle recursivement sur le reste de laliste -->
  73.         <xsl:call-template name="recursiveThemes">
  74.           <xsl:with-param name="themesList" select="substring-after($themesList, $delimiter)"/>
  75.           <xsl:with-param name="delimiter" select="$delimiter"/>
  76.         </xsl:call-template>
  77.       </xsl:when>
  78.       <xsl:otherwise>
  79.         <xsl:choose>
  80.           <!-- liste vide -->
  81.           <xsl:when test="$themesList = ''"/>
  82.           <xsl:otherwise>
  83.             <!-- liste a un seul terme, on le traite -->
  84.             <xsl:call-template name="Theme">
  85.               <xsl:with-param name="theme" select="$themesList"/>
  86.             </xsl:call-template>
  87.           </xsl:otherwise>
  88.         </xsl:choose>
  89.       </xsl:otherwise>
  90.     </xsl:choose>
  91.   </xsl:template>
  92.  
  93.   <xsl:template name="Theme">
  94.     <xsl:param name="theme"/>
  95.     <p class="thèmes"> <xsl:value-of select="translate($theme, $lowercase, $uppercase)"/> </p>
  96.     <table>
  97.       <tr>
  98.         <th> Nombre de mots </th>
  99.         <th> Temps (en sec) </th>
  100.         <th> Débit de parole (mots/min) </th>
  101.       </tr>
  102.       <xsl:for-each select="key('regrouper', $theme)">
  103.         <xsl:if test="not(@type = 'nontrans')">
  104.           <xsl:variable name="motspartopic" select="sum(Turn//tour/@nbmots)"/>
  105.           <xsl:variable name="tempspartopic" select="sum(Turn/@endTime) - sum(Turn/@startTime)"/>
  106.           <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  107.           <tr>
  108.             <td>
  109.               <xsl:value-of select="$motspartopic"/>
  110.             </td>
  111.             <td>
  112.               <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
  113.             </td>
  114.             <td>
  115.               <xsl:value-of select="format-number($calculdébit, '0')"/>
  116.             </td>
  117.           </tr>
  118.         </xsl:if>
  119.       </xsl:for-each>
  120.     </table>
  121.     <br/>
  122.   </xsl:template>
  123.  
  124.   <xsl:template match="Section">
  125.     <p class="topic"><xsl:value-of select="@id"/></p>
  126.     <table>
  127.       <tr>
  128.         <th> Noms </th>
  129.         <th> Texte </th>
  130.         <th> Temps (en sec) </th>
  131.         <th> Nombre de mots </th>
  132.       </tr>
  133.       <xsl:apply-templates select="Turn[normalize-space(@speaker) != '' and normalize-space(.) != '']"/>
  134.     </table>
  135.     <br/>
  136.   </xsl:template>
  137.  
  138.   <xsl:template match="Turn">
  139.     <xsl:variable name="speaker" select="key('speaker', @speaker)"/>
  140.     <tr>       
  141.       <xsl:choose>
  142.         <xsl:when test="$speaker">
  143.           <td> <xsl:value-of select="$speaker/@name"/> </td>
  144.         </xsl:when>
  145.         <xsl:otherwise><td> Simultané </td>
  146.         </xsl:otherwise>
  147.       </xsl:choose>
  148.       <td>
  149.         <xsl:apply-templates select=".//motBDL"/>
  150.       </td>
  151.       <td>
  152.         <xsl:value-of select="format-number(@endTime - @startTime, '0.0')"/>
  153.       </td>
  154.       <td>
  155.         <xsl:value-of select="count(.//motBDL)"/>
  156.       </td>
  157.     </tr>
  158.   </xsl:template>
  159.  
  160.   <xsl:template match="motBDL">
  161.     <xsl:if test="preceding-sibling::motBDL">
  162.       <xsl:text> </xsl:text>
  163.     </xsl:if>
  164.     <xsl:apply-templates />
  165.   </xsl:template>
  166.  
  167. </xsl:stylesheet>


Ça fait a peu près la même chose que votre feuille, mais c'est plus dans l'esprit XSL avec des apply-templates. Chaque template fait moins d'un écran, ce qui est bien plus gérable.
Le seul truc un peu compliqué, c'est le template récursif, car en xsl 1.0 on ne peut pas faire un for-each sur une liste de mots pour appliquer un template a chaque mots, alors il faut faire un template récursif, qui traite le premier mot et s'appelle sur le reste de la liste. Et bien sur en xsl 1.0, il y a pas non plus de liste de mots, alors il faut simuler, en découpant au premier délimiteur.
Bon, j'ai bien commenté, alors ça devrait être compréhensible.
En xsl 2.0 on ferait simplement
<xsl:for-each select="('Amour', 'Dispute', 'Autre')">
  <xsl:call-template name="Theme">
    <xsl:with-param name="theme" select="."/>
   </xsl:call-template>
</xsl:for-each>
Pareil, il y a pas de fonction pour transformer des minuscules en majuscules, alors il faut utiliser translate, ce qui est lourd.  
En xsl 2.0 il y a upper-case()
 
Donc si vous m'expliquez clairement ce que vous voulez voir apparaitre de plus en sortie je serais sans doute en mesure de vous aider.
Mais avoir un fichier de données complet serait un plus, il y a pastebin.com qui est parfait pour cela.
 
A+,


Message édité par gilou le 30-04-2018 à 23:44:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314735
chenaff
Posté le 01-05-2018 à 00:13:18  profilanswer
 

On s'est répondu en même temps, du coup je sais pas si vous avez vu mon message d'avant. J'y explique comment je veux faire apparaître les totaux et la moyenne. En espérant que ce soit plus clair cette fois.
 
De mon côté j'essaie d'analyser et comprendre votre code
 
Merci encore !


Message édité par chenaff le 01-05-2018 à 00:14:05
n°2314736
gilou
Modérateur
Modzilla
Posté le 01-05-2018 à 00:34:54  profilanswer
 

Un truc dans ce genre la alors?

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet
  3.   version="1.0"
  4.   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.  
  6.   <xsl:strip-space elements="*"/>
  7.  
  8.   <xsl:output method="html"/>
  9.  
  10.   <xsl:key name="regrouper" match="Section[not(@type = 'nontrans')]" use="@id"/>
  11.   <xsl:key name="speaker" match="Speaker" use="@id"/>
  12.  
  13.   <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
  14.   <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
  15.  
  16.   <xsl:template match="/">
  17.     <xsl:apply-templates />
  18.   </xsl:template>
  19.  
  20.   <xsl:template match="Trans">
  21.     <html>
  22.       <head>
  23.         <title> Amour ou dispute ? </title>
  24.         <link rel="stylesheet" type="text/css" href="tableaux.css"/>
  25.       </head>
  26.       <body>
  27.         <p id="sujetcorpus"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  28.         <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  29.         <p id="vs"> AMOUR VS DISPUTE </p>
  30.         <xsl:apply-templates select="Speakers"/>
  31.         <br/>
  32.         <xsl:call-template name="recursiveThemes">
  33.           <xsl:with-param name="themesList" select="'Amour Dispute Autre'"/>
  34.           <xsl:with-param name="delimiter" select="' '"/>
  35.         </xsl:call-template>
  36.         <!-- table des totaux -->
  37.         <p class="thèmes"> TOTAL </p>
  38.         <table>
  39.           <tr>
  40.             <th> thèmes </th>
  41.             <th> total nombre de mots par thème </th>
  42.             <th> total temps par thème </th>
  43.             <th> moyenne du débit de parole par thème </th>
  44.           </tr>
  45.           <xsl:call-template name="recursiveTotal">
  46.             <xsl:with-param name="themesList" select="'Amour Dispute Autre'"/>
  47.             <xsl:with-param name="delimiter" select="' '"/>
  48.           </xsl:call-template>
  49.         </table>
  50.         <p class="secondepartie"> Tours de parole </p>
  51.         <xsl:apply-templates select="Episode/Section[not(@type = 'nontrans')]"/>
  52.       </body>
  53.     </html>
  54.   </xsl:template>
  55.  
  56.   <xsl:template match="Speakers">
  57.     <table>
  58.       <tr>
  59.         <th> Noms des participants </th>
  60.         <th> Genre </th>
  61.       </tr>
  62.       <xsl:for-each select="Speaker">
  63.         <xsl:sort select="@name"/>
  64.         <tr>
  65.           <td>
  66.             <xsl:value-of select="@name"/>
  67.           </td>
  68.           <td>
  69.             <xsl:value-of select="@type"/>
  70.           </td>
  71.         </tr>
  72.       </xsl:for-each>
  73.     </table>
  74.   </xsl:template>
  75.  
  76.   <xsl:template name="recursiveThemes">
  77.     <xsl:param name="themesList"/>
  78.     <xsl:param name="delimiter"/>
  79.     <xsl:choose>
  80.       <xsl:when test="contains($themesList, $delimiter)">
  81.         <!-- On a un délimiteur, donc liste a plus d'un terme -->
  82.         <!-- On traite le premier terme de la liste -->
  83.         <xsl:call-template name="Theme">
  84.           <xsl:with-param name="theme" select="substring-before($themesList, $delimiter)"/>
  85.         </xsl:call-template>
  86.         <!-- et on appelle recursivement sur le reste de laliste -->
  87.         <xsl:call-template name="recursiveThemes">
  88.           <xsl:with-param name="themesList" select="substring-after($themesList, $delimiter)"/>
  89.           <xsl:with-param name="delimiter" select="$delimiter"/>
  90.         </xsl:call-template>
  91.       </xsl:when>
  92.       <xsl:otherwise>
  93.         <xsl:choose>
  94.           <!-- liste vide -->
  95.           <xsl:when test="$themesList = ''"/>
  96.           <xsl:otherwise>
  97.             <!-- liste a un seul terme, on le traite -->
  98.             <xsl:call-template name="Theme">
  99.               <xsl:with-param name="theme" select="$themesList"/>
  100.             </xsl:call-template>
  101.           </xsl:otherwise>
  102.         </xsl:choose>
  103.       </xsl:otherwise>
  104.     </xsl:choose>
  105.   </xsl:template>
  106.  
  107.   <xsl:template name="Theme">
  108.     <xsl:param name="theme"/>
  109.     <p class="thèmes"> <xsl:value-of select="translate($theme, $lowercase, $uppercase)"/> </p>
  110.     <table>
  111.       <tr>
  112.         <th> Nombre de mots </th>
  113.         <th> Temps (en sec) </th>
  114.         <th> Débit de parole (mots/min) </th>
  115.       </tr>
  116.       <xsl:for-each select="key('regrouper', $theme)">
  117.         <xsl:if test="not(@type = 'nontrans')">
  118.           <xsl:variable name="motspartopic" select="sum(Turn//tour/@nbmots)"/>
  119.           <xsl:variable name="tempspartopic" select="sum(Turn/@endTime) - sum(Turn/@startTime)"/>
  120.           <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  121.           <tr>
  122.             <td>
  123.               <xsl:value-of select="$motspartopic"/>
  124.             </td>
  125.             <td>
  126.               <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
  127.             </td>
  128.             <td>
  129.               <xsl:value-of select="format-number($calculdébit, '0')"/>
  130.             </td>
  131.           </tr>
  132.         </xsl:if>
  133.       </xsl:for-each>
  134.     </table>
  135.     <br/>
  136.   </xsl:template>
  137.  
  138.   <xsl:template name="recursiveTotal">
  139.     <xsl:param name="themesList"/>
  140.     <xsl:param name="delimiter"/>
  141.     <xsl:choose>
  142.       <xsl:when test="contains($themesList, $delimiter)">
  143.         <!-- On a un délimiteur, donc liste a plus d'un terme -->
  144.         <!-- On traite le premier terme de la liste -->
  145.         <xsl:call-template name="Total">
  146.           <xsl:with-param name="theme" select="substring-before($themesList, $delimiter)"/>
  147.         </xsl:call-template>
  148.         <!-- et on appelle recursivement sur le reste de laliste -->
  149.         <xsl:call-template name="recursiveTotal">
  150.           <xsl:with-param name="themesList" select="substring-after($themesList, $delimiter)"/>
  151.           <xsl:with-param name="delimiter" select="$delimiter"/>
  152.         </xsl:call-template>
  153.       </xsl:when>
  154.       <xsl:otherwise>
  155.         <xsl:choose>
  156.           <!-- liste vide -->
  157.           <xsl:when test="$themesList = ''"/>
  158.           <xsl:otherwise>
  159.             <!-- liste a un seul terme, on le traite -->
  160.             <xsl:call-template name="Total">
  161.               <xsl:with-param name="theme" select="$themesList"/>
  162.             </xsl:call-template>
  163.           </xsl:otherwise>
  164.         </xsl:choose>
  165.       </xsl:otherwise>
  166.     </xsl:choose>
  167.   </xsl:template>
  168.  
  169.   <xsl:template name="Total">
  170.     <xsl:param name="theme"/>
  171.     <xsl:variable name="groupe" select="key('regrouper', $theme)"/>
  172.     <xsl:variable name="motspartopic" select="sum($groupe/Turn//tour/@nbmots)"/>
  173.     <xsl:variable name="tempspartopic" select="sum($groupe/Turn/@endTime) - sum($groupe/Turn/@startTime)"/>
  174.     <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  175.     <tr>
  176.       <td>
  177.         <xsl:value-of select="translate($theme, $uppercase, $lowercase)"/>
  178.       </td><td>
  179.         <xsl:value-of select="$motspartopic"/>
  180.       </td>
  181.       <td>
  182.         <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
  183.       </td>
  184.       <td>
  185.         <xsl:choose>
  186.           <xsl:when test="string(number($calculdébit))='NaN'">
  187.             <xsl:value-of select="'-'"/>
  188.           </xsl:when>
  189.           <xsl:otherwise>
  190.             <xsl:value-of select="format-number($calculdébit, '0')"/>
  191.           </xsl:otherwise>
  192.         </xsl:choose>
  193.       </td>
  194.     </tr>
  195.   </xsl:template>
  196.  
  197.   <xsl:template match="Section">
  198.     <p class="topic"><xsl:value-of select="@id"/></p>
  199.     <table>
  200.       <tr>
  201.         <th> Noms </th>
  202.         <th> Texte </th>
  203.         <th> Temps (en sec) </th>
  204.         <th> Nombre de mots </th>
  205.       </tr>
  206.       <xsl:apply-templates select="Turn[normalize-space(@speaker) != '' and normalize-space(.) != '']"/>
  207.     </table>
  208.     <br/>
  209.   </xsl:template>
  210.  
  211.   <xsl:template match="Turn">
  212.     <xsl:variable name="speaker" select="key('speaker', @speaker)"/>
  213.     <tr>       
  214.       <xsl:choose>
  215.         <xsl:when test="$speaker">
  216.           <td> <xsl:value-of select="$speaker/@name"/> </td>
  217.         </xsl:when>
  218.         <xsl:otherwise><td> Simultané </td>
  219.         </xsl:otherwise>
  220.       </xsl:choose>
  221.       <td>
  222.         <xsl:apply-templates select=".//motBDL"/>
  223.       </td>
  224.       <td>
  225.         <xsl:value-of select="format-number(@endTime - @startTime, '0.0')"/>
  226.       </td>
  227.       <td>
  228.         <xsl:value-of select="count(.//motBDL)"/>
  229.       </td>
  230.     </tr>
  231.   </xsl:template>
  232.  
  233.   <xsl:template match="motBDL">
  234.     <xsl:if test="preceding-sibling::motBDL">
  235.       <xsl:text> </xsl:text>
  236.     </xsl:if>
  237.     <xsl:apply-templates />
  238.   </xsl:template>
  239.  
  240. </xsl:stylesheet>


Pas sur que le calcul de la moyenne soit celui que vous voulez, a vous d'adapter à vos besoins.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314737
chenaff
Posté le 01-05-2018 à 00:43:21  profilanswer
 

Alors oui, c'est exactement ce que je cherchais !
Mais sincèrement c'est un travail beaucoup trop parfait et compliqué pour mon niveau.. Je suis censé comprendre le code et pouvoir l'expliquer à l'oral, et là j'en serais incapable malheureusement. (d'autant plus que je ne suis pas seule, c'est un travail à 6, mais les autres ne comprenne déjà pas le xsl que j'ai fait donc je vous laisse imaginer le votre beaucoup trop complet haha...)
Vous n'auriez pas une solution à partir de ma structure xsl par hasard ?


Message édité par chenaff le 01-05-2018 à 00:48:12
mood
Publicité
Posté le 01-05-2018 à 00:43:21  profilanswer
 

n°2314738
gilou
Modérateur
Modzilla
Posté le 01-05-2018 à 00:52:09  profilanswer
 

Non, la c'est à vous de progresser et comprendre le code.
Surtout que a part les appels récursifs (que vous pouvez refaire en trois appels, comme dans votre code original, mais c'est pas dans ma philosophie de coder trois fois la même chose), le reste est absolument standard: des règles template qui en appellent d'autres via un apply-templates ou (plus rarement) un call-template. Il y a pas plus basique en xsl.
Je répondrais à vos questions, mais...demain. [:charles k:2]  
 
En plus, il ne faut vraiment pas avoir honte de votre niveau en xsl: quand on fait passer des tests xsl en pré-entretien d'embauche, la majorité des candidats présentés par des SSII n'ont pas votre niveau (par contre, c'est une honte qu'un enseignant demande du xsl 1.0 alors qu'on est en 3.0 de nos jours, et que la version java de Saxon-HE, le processeur xsl de référence, peut s'utiliser sans difficulté. Je pourrais à la limite comprendre si le xsl était appelé au moment du processing des données xml par le browser, mais dans la vie réelle, le xsl ne s'utilise plus comme ça).  
 
A+,


Message édité par gilou le 01-05-2018 à 01:08:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314740
chenaff
Posté le 01-05-2018 à 01:07:03  profilanswer
 

Je comprends, c'est déjà beaucoup ce que vous m'avez montré et le temps que vous y avez consacré. Malgré tout, j'ai encore beaucoup de mal à saisir les templates, apply-templates et call-template justement. Je me renseigne sur beaucoup de sites, je fais mon ptit mélange et j'ai finalement réussi à sortir quelque chose pour le moment, mais y ayant passée près d'une semaine complète, j'ai plus vraiment le temps.. on doit passer à l'oral sur ce projet dans 4 jours, et j'ai encore un autre examen avant à réviser.
Donc malheureusement je pense que je n'arriverai pas à résoudre mon problème ^^
 
Bonne nuit à vous

n°2314741
gilou
Modérateur
Modzilla
Posté le 01-05-2018 à 01:15:25  profilanswer
 

C'est la base:
<xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
 
<xsl:apply-templates /> sans plus signifie <xsl:apply-templates select="*"/> ie on dispatche le traitement aux éléments fils de l'élément courant.
Ici l'élément courant c'est /, ie le document, il a un seul fils, la racine, Trans
 
Donc  
<xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
ça fait <xsl:apply-templates select="*"/> c'est a dire <xsl:apply-templates select="Trans"/> et c'est donc traité par:
<xsl:template match="Trans">...</xsl:template>
etc.
 
Je commence donc le traitement sur la racine
<xsl:template match="Trans">
    <html>
      <head>
        <title> Amour ou dispute ? </title>
        <link rel="stylesheet" type="text/css" href="tableaux.css"/>
      </head>
      <body>
        <p id="sujetcorpus"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
        <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
        <p id="vs"> AMOUR VS DISPUTE </p>
        <xsl:apply-templates select="Speakers"/>
        <br/>
        <xsl:call-template name="recursiveThemes">
          <xsl:with-param name="themesList" select="'Amour Dispute Autre'"/>
          <xsl:with-param name="delimiter" select="' '"/>
        </xsl:call-template>

        <!-- table des totaux -->
        <p class="thèmes"> TOTAL </p>
        <table>
          <tr>
            <th> thèmes </th>
            <th> total nombre de mots par thème </th>
            <th> total temps par thème </th>
            <th> moyenne du débit de parole par thème </th>
          </tr>
          <xsl:call-template name="recursiveTotal">
            <xsl:with-param name="themesList" select="'Amour Dispute Autre'"/>
            <xsl:with-param name="delimiter" select="' '"/>
          </xsl:call-template>

        </table>
        <p class="secondepartie"> Tours de parole </p>
        <xsl:apply-templates select="Episode/Section[not(@type = 'nontrans')]"/>
      </body>
    </html>
  </xsl:template>
Et sur certains fils ou descendants de Trans, on déclenche des traitements adaptés aux données qu'ils contiennent, etc.
Comme dit, si les trucs récursif vous sont incompréhensibles, vous les remplacez par le traitement en triple comme dans votre code dont je suis parti.
 
apply-templates, c'est pratique, parce que avec une règle par défaut
<xsl:template match="*">
    <xsl:apply-templates />
  </xsl:template>
Ça va propager (sans rien faire) les traitement aux fils, aux fils des fils, etc, jusqu'à ce qu'on tombe sur des fils pour lesquels des règles précises ont été écrites.
et il y a d'autres choses comme les modes qui permettent de faire un traitement fin au niveau des apply-templates.
Quand on a besoin de chose ressemblant plus a un appel de fonction, on passe par un call-template. (en xsl 2.0 on peut aussi définir des fonctions)
 
A+,


Message édité par gilou le 01-05-2018 à 01:29:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314746
gilou
Modérateur
Modzilla
Posté le 01-05-2018 à 10:56:34  profilanswer
 

Une dernière remarque, pour regrouper des éléments xsl, il y a xsl:for-each-group, qui est très puissant, mais cet élément n'est apparu qu'avec xsl 2.0...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314752
chenaff
Posté le 01-05-2018 à 13:00:31  profilanswer
 

Citation :

Comme dit, si les trucs récursif vous sont incompréhensibles, vous les remplacez par le traitement en triple comme dans votre code dont je suis parti.  
 


 
Ca fait déjà bien 3h que j'essaie mais je ne trouve rien. Tout est imbriqué ensemble dans votre code, avec des templates, call-templates etc. Etant donné que j'ai pas du tout la même structure, et que j'ai du mal à comprendre la votre, je ne comprends pas comment je peux reprendre des éléments et les adapter à ma structure, ça m'indique "Erreur lors de la transformation XLST : Une erreur inconnue s’est produite ()."
 
Je regarde dans les <xsl:template name="Total"> et <xsl:template name="recursiveTotal"> mais je ne sais pas quoi prendre et comment l'adapter...

n°2314754
gilou
Modérateur
Modzilla
Posté le 01-05-2018 à 15:38:41  profilanswer
 

Il suffit de remplacer  
<xsl:call-template name="recursiveTotal">
  <xsl:with-param name="themesList" select="'Amour Dispute Autre'"/>
  <xsl:with-param name="delimiter" select="' '"/>
</xsl:call-template>
par
<xsl:call-template name="Total">
  <xsl:with-param name="theme" select="'Amour'"/>
</xsl:call-template>
<xsl:call-template name="Total">
  <xsl:with-param name="theme" select="'Dispute'"/>
</xsl:call-template>
<xsl:call-template name="Total">
  <xsl:with-param name="theme" select="'Autre'"/>
</xsl:call-template>
Et le tour est joué, et idem pour recursiveThemes
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet
  3.   version="1.0"
  4.   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.  
  6.   <xsl:strip-space elements="*"/>
  7.  
  8.   <xsl:output method="html"/>
  9.  
  10.   <xsl:key name="regrouper" match="Section[not(@type = 'nontrans')]" use="@id"/>
  11.   <xsl:key name="speaker" match="Speaker" use="@id"/>
  12.  
  13.   <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
  14.   <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
  15.  
  16.   <xsl:template match="/">
  17.     <xsl:apply-templates />
  18.   </xsl:template>
  19.  
  20.   <xsl:template match="Trans">
  21.     <html>
  22.       <head>
  23.         <title> Amour ou dispute ? </title>
  24.         <link rel="stylesheet" type="text/css" href="tableaux.css"/>
  25.       </head>
  26.       <body>
  27.         <p id="sujetcorpus"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
  28.         <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
  29.         <p id="vs"> AMOUR VS DISPUTE </p>
  30.         <xsl:apply-templates select="Speakers"/>
  31.         <br/>
  32.         <xsl:call-template name="Theme">
  33.           <xsl:with-param name="theme" select="'Amour'"/>
  34.         </xsl:call-template>
  35.         <xsl:call-template name="Theme">
  36.           <xsl:with-param name="theme" select="'Dispute'"/>
  37.         </xsl:call-template>
  38.         <xsl:call-template name="Theme">
  39.           <xsl:with-param name="theme" select="'Autre'"/>
  40.         </xsl:call-template>
  41.         <!-- table des totaux -->
  42.         <p class="thèmes"> TOTAL </p>
  43.         <table>
  44.           <tr>
  45.             <th> thèmes </th>
  46.             <th> total nombre de mots par thème </th>
  47.             <th> total temps par thème </th>
  48.             <th> moyenne du débit de parole par thème </th>
  49.           </tr>
  50.           <xsl:call-template name="Total">
  51.             <xsl:with-param name="theme" select="'Amour'"/>
  52.           </xsl:call-template>
  53.           <xsl:call-template name="Total">
  54.             <xsl:with-param name="theme" select="'Dispute'"/>
  55.           </xsl:call-template>
  56.           <xsl:call-template name="Total">
  57.             <xsl:with-param name="theme" select="'Autre'"/>
  58.           </xsl:call-template>
  59.         </table>
  60.         <p class="secondepartie"> Tours de parole </p>
  61.         <xsl:apply-templates select="Episode/Section[not(@type = 'nontrans')]"/>
  62.       </body>
  63.     </html>
  64.   </xsl:template>
  65.  
  66.   <xsl:template match="Speakers">
  67.     <table>
  68.       <tr>
  69.         <th> Noms des participants </th>
  70.         <th> Genre </th>
  71.       </tr>
  72.       <xsl:for-each select="Speaker">
  73.         <xsl:sort select="@name"/>
  74.         <tr>
  75.           <td>
  76.             <xsl:value-of select="@name"/>
  77.           </td>
  78.           <td>
  79.             <xsl:value-of select="@type"/>
  80.           </td>
  81.         </tr>
  82.       </xsl:for-each>
  83.     </table>
  84.   </xsl:template>
  85.  
  86.   <xsl:template name="Theme">
  87.     <xsl:param name="theme"/>
  88.     <p class="thèmes"> <xsl:value-of select="translate($theme, $lowercase, $uppercase)"/> </p>
  89.     <table>
  90.       <tr>
  91.         <th> Nombre de mots </th>
  92.         <th> Temps (en sec) </th>
  93.         <th> Débit de parole (mots/min) </th>
  94.       </tr>
  95.       <xsl:for-each select="key('regrouper', $theme)">
  96.         <xsl:if test="not(@type = 'nontrans')">
  97.           <xsl:variable name="motspartopic" select="sum(Turn//tour/@nbmots)"/>
  98.           <xsl:variable name="tempspartopic" select="sum(Turn/@endTime) - sum(Turn/@startTime)"/>
  99.           <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  100.           <tr>
  101.             <td>
  102.               <xsl:value-of select="$motspartopic"/>
  103.             </td>
  104.             <td>
  105.               <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
  106.             </td>
  107.             <td>
  108.               <xsl:value-of select="format-number($calculdébit, '0')"/>
  109.             </td>
  110.           </tr>
  111.         </xsl:if>
  112.       </xsl:for-each>
  113.     </table>
  114.     <br/>
  115.   </xsl:template>
  116.  
  117.   <xsl:template name="Total">
  118.     <xsl:param name="theme"/>
  119.     <xsl:variable name="groupe" select="key('regrouper', $theme)"/>
  120.     <xsl:variable name="motspartopic" select="sum($groupe/Turn//tour/@nbmots)"/>
  121.     <xsl:variable name="tempspartopic" select="sum($groupe/Turn/@endTime) - sum($groupe/Turn/@startTime)"/>
  122.     <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
  123.     <tr>
  124.       <td>
  125.         <xsl:value-of select="translate($theme, $uppercase, $lowercase)"/>
  126.       </td><td>
  127.         <xsl:value-of select="$motspartopic"/>
  128.       </td>
  129.       <td>
  130.         <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
  131.       </td>
  132.       <td>
  133.         <xsl:choose>
  134.           <xsl:when test="string(number($calculdébit))='NaN'">
  135.             <xsl:value-of select="'-'"/>
  136.           </xsl:when>
  137.           <xsl:otherwise>
  138.             <xsl:value-of select="format-number($calculdébit, '0')"/>
  139.           </xsl:otherwise>
  140.         </xsl:choose>
  141.       </td>
  142.     </tr>
  143.   </xsl:template>
  144.  
  145.   <xsl:template match="Section">
  146.     <p class="topic"><xsl:value-of select="@id"/></p>
  147.     <table>
  148.       <tr>
  149.         <th> Noms </th>
  150.         <th> Texte </th>
  151.         <th> Temps (en sec) </th>
  152.         <th> Nombre de mots </th>
  153.       </tr>
  154.       <xsl:apply-templates select="Turn[normalize-space(@speaker) != '' and normalize-space(.) != '']"/>
  155.     </table>
  156.     <br/>
  157.   </xsl:template>
  158.  
  159.   <xsl:template match="Turn">
  160.     <xsl:variable name="speaker" select="key('speaker', @speaker)"/>
  161.     <tr>       
  162.       <xsl:choose>
  163.         <xsl:when test="$speaker">
  164.           <td> <xsl:value-of select="$speaker/@name"/> </td>
  165.         </xsl:when>
  166.         <xsl:otherwise><td> Simultané </td>
  167.         </xsl:otherwise>
  168.       </xsl:choose>
  169.       <td>
  170.         <xsl:apply-templates select=".//motBDL"/>
  171.       </td>
  172.       <td>
  173.         <xsl:value-of select="format-number(@endTime - @startTime, '0.0')"/>
  174.       </td>
  175.       <td>
  176.         <xsl:value-of select="count(.//motBDL)"/>
  177.       </td>
  178.     </tr>
  179.   </xsl:template>
  180.  
  181.   <xsl:template match="motBDL">
  182.     <xsl:if test="preceding-sibling::motBDL">
  183.       <xsl:text> </xsl:text>
  184.     </xsl:if>
  185.     <xsl:apply-templates />
  186.   </xsl:template>
  187.  
  188. </xsl:stylesheet>


 
 
Et pour suivre le cheminement, c'est un jeu de piste, mais facile à suivre:
Au départ:
<xsl:template match="/">
il fait <xsl:apply-templates />
Donc il applique un template (s'il y en a un avec une règle match qui colle) sur chacun de ses fils.
Il y a qu'un fils, Trans, et on a un template <xsl:template match="Trans"> c'est donc lui qui va être appliqué.
Dans le template <xsl:template match="Trans"> je vais pister la fin:
Ca se termine par <xsl:apply-templates select="Episode/Section[not(@type = 'nontrans')]"/>
On va donc filtrer tous les petits fils Section de Trans qui ont un père Episode et dont l'attribut trans n'est pas à nontrans et on va chercher à leur appliquer un template.
Or justement, il y en a un qui matche les éléments Section, c'est donc lui qui va être appliqué: <xsl:template match="Section">
Ce template fait des choses localement, puis a un appel <xsl:apply-templates select="Turn[normalize-space(@speaker) != '' and normalize-space(.) != '']"/>
On va donc chercher quel template a appliquer aux fils Turn de la section qui remplissent la condition.
Et on a justement un template qui matche Turn <xsl:template match="Turn"> c'est lui qui va être appliqué.
Il fait des choses localement, et a un moment il fait <xsl:apply-templates select=".//motBDL"/> donc on va appliquer aux descendants motBDL du Turn un template, et on en trouve un qui colle: <xsl:template match="motBDL">
Ce dernier ajoute un blanc devant si le mot n'est pas le premier, puis fait:<xsl:apply-templates />
La on a un cas spécial: le contenu de motBDL est du texte. dans ce cas la, il y a une règle par défaut qui fait que <xsl:apply-templates /> sur du teste renvoie le texte.
Et voilou. On est au bout.
 
 
 
Ca peu sembler complexe, mais c'est parce qu'on fait ainsi en général quand on écrit le code:
J'ai de l'info portée par un élément A, je fait un <xsl:template match="A"> et j'indique dedans ce que je fais de l'info trouvée dans A.
Si je suis dans le template et que j'ai besoin de l'info portée par un ensemble de fils de A, je ne récupère pas directement l'info, mais je fais <xsl:apply-templates /> ou bien <xsl:apply-templates select="B"/> si ce sont des fils particulier et j"écris la récupération de l'info sur chaque fils dans un template qui matche les fils. etc.
Exemple ici:
Je veux faire un tableau dont les lignes sont faites a partir des infos portées par les éléments Speaker.
J'écris un template pour cet element qui va fabriquer une ligne a partir de l'info trouvée sur l'element:
 <xsl:template match="Speaker">
    <tr>
      <td><xsl:value-of select="@name"/></td>
      <td><xsl:value-of select="@type"/></td>
    </tr>
  </xsl:template>
Maintenant que j'ai les lignes du tableau, J'écris un template pour le pere des elements Speaker, pour creer la table et creant un en tête, puis en créant les lignes avec le template sur les elements Speaker:
 <xsl:template match="Speakers">
    <table>
      <tr>
        <th>Noms des participants</th>
        <th>Genre</th>
      </tr>
      <xsl:apply-templates />
    </table>
  </xsl:template>
Ce template est sur le pere des element Speaker, Speakers, et comme il n'a que des enfants Speaker je peux écrire <xsl:apply-templates /> sinon, je devrais faire <xsl:apply-templates select="Speaker"/>.
 
Ensuite, je regarde le pere de Speakers, et lui met un template pour qu'il appelle le template qu'on vient de creer. C'est Trans, la racine du document. Comme c'est la racine, je vais ajouter dans son template ce qui manque pour qu'en sortie on ait bien un document html:
  <xsl:template match="Trans">
    <html>
      <head>
        <title> Amour ou dispute ? </title>
        <link rel="stylesheet" type="text/css" href="tableaux.css"/>
      </head>
      <body>
        <p id="sujetcorpus"> Les principaux sujets de conversation <br/> dans la télé-réalité </p>
        <p id="corpus"> Les marseillais VS le reste du monde 2 </p>
        <p id="vs"> AMOUR VS DISPUTE </p>
        <xsl:apply-templates select="Speakers"/>
      </body>
    </html>
  </xsl:template>
et pour appeller ce template je vais en crééer un sur le document, point de départ de la transfo html:
  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
A ce stade la, les 4 templates vont nous crééer le document html en sortie avec la table, et cerise sur le gateau, si je veux trier les lignes du tableau selon la valeur de l'attribut @name je peux le faire avec simple modification:
  <xsl:template match="Speakers">
    <table>
      <tr>
        <th>Noms des participants</th>
        <th>Genre</th>
      </tr>
      <xsl:apply-templates>
        <xsl:sort select="@name"/>
      </xsl:apply-templates>
    </table>
  </xsl:template>
Je crois que je peux pas faire plus pédagogique.
 
A+,


Message édité par gilou le 01-05-2018 à 17:22:24

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314759
chenaff
Posté le 01-05-2018 à 17:42:03  profilanswer
 

HAAAAAAA tout devient clair maintenant ! Je comprends beaucoup mieux de cette façon ! J'ai essayé de plus me renseigner sur les templates, call-template et apply-template, et j'arrive mieux à saisir pourquoi et comment on les utilise. Enfin du moins dans le code ici, j'y arrive cette fois.
 
Il reste malgré tout des petites choses que je ne comprends pas.
 
  <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
    et on retrouve à 2 endroits: <xsl:value-of select="translate($theme, $lowercase, $uppercase)"/>

 
Je ne comprends pas l'utilité de lowercase et uppercase, pourquoi en avoir besoin dans mon xsl ?  
En essayant de supprimer les variables et de remplacer le value of par <xsl:value-of select="$theme"/>, la page m'indique une erreur, pourquoi ?
 
Ensuite pour le total à présent j'arrive à saisir, mais la moyenne du débit de parole, pas vraiment.
<xsl:when test="string(number($calculdébit))='NaN'">
je ne connais pas les notions string et NaN  :??:  

n°2314761
gilou
Modérateur
Modzilla
Posté le 01-05-2018 à 18:37:03  profilanswer
 

> Je ne comprends pas l'utilité de lowercase et uppercase, pourquoi en avoir besoin dans mon xsl ?  
C'est pour tout mettre en majuscule ou minuscule (c'était comme ça dans ton affichage).
En xsl 2.0 on ferait <xsl:value-of select="upper-case($theme)"/> mais en XSL 1.0 il y avait pas et fallait se débrouiller avec translate pour mapper les lettres minuscules sur les majuscules.
 
> <xsl:when test="string(number($calculdébit))='NaN'">  
Là c'est une astuce xsl: quand le calcul qui calcule $calculdébit fait une division par zéro parce que $tempspartopic est nul (ce qui arrive sur mes exemples restreints par manque de données) la valeur calculée est NaN (c'est une valeur normalisée dans le monde des nombres a virgule, qui signifie Not a Number, bref, ça sort pas du chapeau XML). Si je laisse tel quel, ça va imprimer NaN dans ton tableau, ce qui est pas joli.
Le test <xsl:when test="string(number($toto))='NaN'"> teste si $toto vaut NaN (on teste si sa représentation sous forme de texte est 'NaN' en fait parce qu'on peux pas tester $toto = NaN, le terme de droite est pas compris comme la valeur numérique NaN par le systeme. string() renvoie la chaine de caractère qui sera imprimée pour représenter un nombre). Si oui, je fais afficher '-' plutôt que 'NaN' dans le tableau.
 
A+,


Message édité par gilou le 01-05-2018 à 18:47:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2314766
chenaff
Posté le 01-05-2018 à 19:31:07  profilanswer
 

Ah oui d'accord ! J'ai essayé de voir en l'enlevant si ça marchait et cette fois ça marche, je sais pas ce que j'ai changé haha
En tout cas je peux le mettre ou non, je sais comment ça fonctionne donc c'est cool !
 
Et pour <xsl:when test="string(number($calculdébit))='NaN'"> , ça reste assez flou mais en tout cas ça marche, c'est parfait !
 
 
Je crois que tout est bon maintenant, vous m'avez vraiment beaucoup aidé, je vous remercie mille fois !!
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  regrouper éléments XSL

 

Sujets relatifs
Position d'un élément basée sur le regroupement d'éléments identiques[Excel] macro outlook ne traite jamais dernier mail sauf si un seul
[Résolu] Mettre à jour/ajouter éléments dans un XML en C#offset de plusieurs elements
[JS/Xml] Parser des éléments en fonction de la balise contenante?Jquery - Clone d'elements imbriqués [RESOLU]
[Java/NetBeans] ActionPerformed sur deux éléments "liés"après l'inversion manques des éléments
Centrer des élémentsComment ajouter des éléments une list STL?
Plus de sujets relatifs à : regrouper éléments XSL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR