2 votes

Une variable XSLT dans un prédicat ne fonctionne pas

Mon xml ressemble à ceci :

<units>
    <unit>
        <unitnum></unitnum>
        <Year></Year>
        <Qty></Qty>
    </unit>
</units>

Je crée une clé pour capturer toutes les années possibles. Comme ceci :

<xsl:key name="yr" match="//Year/text()" use="." />

Ensuite, j'effectue une boucle "for-each" à travers les clés pour obtenir des années uniques. Mon objectif final est d'additionner les quantités comme suit :

<xsl:for-each select="//Year/text()[generate-id()=generate-id(key('yr',.)[1])]">
     <li>
        <xsl:variable name="varjobyear" select="."/>
        <xsl:value-of select="$varjobyear"/> - sum -
        <xsl:value-of select="sum(//unit[Year=$varjobyear]/Qty)"/>
     </li>
</xsl:for-each>

Pour une raison quelconque, mon résultat ressemble à ceci :

2010 - sum - 0
2011 - sum - 0
2012 - sum - 0

Mais ce que je veux, c'est que ces 0 soient la somme réelle des quantités pour chaque année.

Je pense qu'il y a un problème avec le prédicat [Year=$varjobyear], mais je n'arrive pas à trouver ce que c'est. J'ai également essayé [Year=string($varjobyear)] et [Year=number($varjobyear)].

Qu'est-ce que je fais de travers ? Merci de votre compréhension.

1voto

Dimitre Novatchev Points 147842

Vous voulez quelque chose comme ceci :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kYearByVal" match="Year" use="."/>

 <xsl:template match="Year[generate-id()=generate-id(key('kYearByVal',.)[1])]">
  <li>
    <xsl:value-of select="concat(., ' - sum - ', sum(key('kYearByVal',.)/../Qty))"/>
  </li>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

Lorsque cette transformation est appliquée au document XML suivant :

<units>
    <unit>
        <unitnum>12</unitnum>
        <Year>1922</Year>
        <Qty>3</Qty>
    </unit>
    <unit>
        <unitnum>13</unitnum>
        <Year>1922</Year>
        <Qty>8</Qty>
    </unit>
    <unit>
        <unitnum>14</unitnum>
        <Year>1999</Year>
        <Qty>5</Qty>
    </unit>
    <unit>
        <unitnum>15</unitnum>
        <Year>1999</Year>
        <Qty>7</Qty>
    </unit>
    <unit>
        <unitnum>16</unitnum>
        <Year>2003</Year>
        <Qty>3</Qty>
    </unit>
</units>

le résultat souhaité et correct est produit :

<li>1922 - sum - 11</li>
<li>1999 - sum - 12</li>
<li>2003 - sum - 3</li>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X