不使用Key的XSLT 1.0组

时间:2015-07-01 12:12:36

标签: xslt xslt-1.0

我一直在努力解决这个问题好几个小时....帮助

首先我必须使用XSLT 1.0,我不能使用xsl:key。我必须对以下xml数据进行排序和分组

<?xml version="1.0" encoding="UTF-8" ?>
 <?xml-stylesheet href="class2.xsl" type="text/xsl" ?>
 <université>
     <étudiant>
         <nom>Réjean Tremblay</nom>
         <cours sigle="INF8430" note="89" />
         <cours sigle="INF1030" note="69" />
         <cours sigle="INF1230" note="75" />
    </étudiant>
    <étudiant>
         <nom>Martin Lambert</nom>
         <cours sigle="INF8430" note="75" />
         <cours sigle="INF1030" note="72" />
         <cours sigle="INF1230" note="73" />
    </étudiant>
     <étudiant>
         <nom>Luc Alain</nom>
         <cours sigle="INF9430" note="39" />
         <cours sigle="INF1030" note="89" />
         <cours sigle="INF1230" note="79" />
    </étudiant>
     <étudiant>
         <nom>Olive Saint-Amant</nom>
         <cours sigle="INF8430" note="91" />
         <cours sigle="INF1230" note="99" />
    </étudiant>
 </université>

预期结果应为

enter image description here

1 个答案:

答案 0 :(得分:2)

没有xsl:key(当然不是最佳的)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:template match="/*">
        <table>
            <tr>
                <td>Sigle</td>
                <td>Nombre d'etuidants</td>
                <td>Moyenne du cours</td>
            </tr>
            <xsl:apply-templates select="etudiant/cours"/>
        </table>
    </xsl:template>

    <xsl:template match="cours[not(@sigle = preceding::cours/@sigle)]">
        <tr>
            <td>
                <xsl:value-of select="@sigle"/>
            </td>
            <xsl:variable name="cnt" select="count(//cours[@sigle = current()/@sigle])"/>
            <td>
                <xsl:value-of select="$cnt"/>
            </td>
            <td>
                <xsl:value-of select="format-number(sum(//cours[@sigle = current()/@sigle]/@note) div $cnt, '#.0')"/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>