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 :
- <?xml version="1.0" encoding="UTF-8"?>
- <xsl:stylesheet
- version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:strip-space elements="*"/>
-
- <xsl:output method="html"/>
-
- <xsl:key name="regrouper" match="Section[not(@type = 'nontrans')]" use="@id"/>
- <xsl:key name="speaker" match="Speaker" use="@id"/>
-
- <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
- <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
-
- <xsl:template match="/">
- <xsl:apply-templates />
- </xsl:template>
-
- <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="Theme">
- <xsl:with-param name="theme" select="'Amour'"/>
- </xsl:call-template>
- <xsl:call-template name="Theme">
- <xsl:with-param name="theme" select="'Dispute'"/>
- </xsl:call-template>
- <xsl:call-template name="Theme">
- <xsl:with-param name="theme" select="'Autre'"/>
- </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="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>
- </table>
- <p class="secondepartie"> Tours de parole </p>
- <xsl:apply-templates select="Episode/Section[not(@type = 'nontrans')]"/>
- </body>
- </html>
- </xsl:template>
-
- <xsl:template match="Speakers">
- <table>
- <tr>
- <th> Noms des participants </th>
- <th> Genre </th>
- </tr>
- <xsl:for-each select="Speaker">
- <xsl:sort select="@name"/>
- <tr>
- <td>
- <xsl:value-of select="@name"/>
- </td>
- <td>
- <xsl:value-of select="@type"/>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </xsl:template>
-
- <xsl:template name="Theme">
- <xsl:param name="theme"/>
- <p class="thèmes"> <xsl:value-of select="translate($theme, $lowercase, $uppercase)"/> </p>
- <table>
- <tr>
- <th> Nombre de mots </th>
- <th> Temps (en sec) </th>
- <th> Débit de parole (mots/min) </th>
- </tr>
- <xsl:for-each select="key('regrouper', $theme)">
- <xsl:if test="not(@type = 'nontrans')">
- <xsl:variable name="motspartopic" select="sum(Turn//tour/@nbmots)"/>
- <xsl:variable name="tempspartopic" select="sum(Turn/@endTime) - sum(Turn/@startTime)"/>
- <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
- <tr>
- <td>
- <xsl:value-of select="$motspartopic"/>
- </td>
- <td>
- <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
- </td>
- <td>
- <xsl:value-of select="format-number($calculdébit, '0')"/>
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- <br/>
- </xsl:template>
-
- <xsl:template name="Total">
- <xsl:param name="theme"/>
- <xsl:variable name="groupe" select="key('regrouper', $theme)"/>
- <xsl:variable name="motspartopic" select="sum($groupe/Turn//tour/@nbmots)"/>
- <xsl:variable name="tempspartopic" select="sum($groupe/Turn/@endTime) - sum($groupe/Turn/@startTime)"/>
- <xsl:variable name="calculdébit" select="($motspartopic * 60) div ($tempspartopic)"/>
- <tr>
- <td>
- <xsl:value-of select="translate($theme, $uppercase, $lowercase)"/>
- </td><td>
- <xsl:value-of select="$motspartopic"/>
- </td>
- <td>
- <xsl:value-of select="format-number($tempspartopic, '0.0')"/>
- </td>
- <td>
- <xsl:choose>
- <xsl:when test="string(number($calculdébit))='NaN'">
- <xsl:value-of select="'-'"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="format-number($calculdébit, '0')"/>
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- </xsl:template>
-
- <xsl:template match="Section">
- <p class="topic"><xsl:value-of select="@id"/></p>
- <table>
- <tr>
- <th> Noms </th>
- <th> Texte </th>
- <th> Temps (en sec) </th>
- <th> Nombre de mots </th>
- </tr>
- <xsl:apply-templates select="Turn[normalize-space(@speaker) != '' and normalize-space(.) != '']"/>
- </table>
- <br/>
- </xsl:template>
-
- <xsl:template match="Turn">
- <xsl:variable name="speaker" select="key('speaker', @speaker)"/>
- <tr>
- <xsl:choose>
- <xsl:when test="$speaker">
- <td> <xsl:value-of select="$speaker/@name"/> </td>
- </xsl:when>
- <xsl:otherwise><td> Simultané </td>
- </xsl:otherwise>
- </xsl:choose>
- <td>
- <xsl:apply-templates select=".//motBDL"/>
- </td>
- <td>
- <xsl:value-of select="format-number(@endTime - @startTime, '0.0')"/>
- </td>
- <td>
- <xsl:value-of select="count(.//motBDL)"/>
- </td>
- </tr>
- </xsl:template>
-
- <xsl:template match="motBDL">
- <xsl:if test="preceding-sibling::motBDL">
- <xsl:text> </xsl:text>
- </xsl:if>
- <xsl:apply-templates />
- </xsl:template>
-
- </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é! --