使用XSLT 1.0对值进行分组

时间:2015-10-26 07:21:52

标签: xml xslt xslt-1.0

我希望你能帮助我;

我有这个xsl代码:

 <xsl:for-each select="//DataSet">
      <xsl:sort select="@wert"/>
      <xsl:sort select="@key"/>
        <tr>
             <td><xsl:value-of select="@orig_pk"/></td>
             <td><xsl:copy-of select="original"/></td>
             <td><xsl:value-of select="@dup_pk"/></td>
             <td><xsl:copy-of select="duplikat"/></td>
             <td><xsl:value-of select="@key"/></td>
             <td><xsl:value-of select="@wert"/></td>
        </tr>
  </xsl:for-each>

代码生成具有正确值的HTML表。现在,我想按key对这些值进行分组,并在每个组上方渲染一个新的<tr>

<tr>
 <th class="data_header" align="left" nowrap="nowrap"><xsl:text>Schlüssel: </xsl:text><xsl:value-of select="@key"/></th>
</tr>

但是因为我们的系统只支持XSLT 1.0,所以我不能使用<xsl:for-each-group>,因为我只能在xsl中做简单的事情我无法用Muenchian method执行此操作

现在我的问题是;有人可以帮助我实现这个并解释一下吗?

非常感谢你。

1 个答案:

答案 0 :(得分:3)

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

    <!-- this key allows us to quickly get a set of DataSet elements where @key equals to specified value -->
    <xsl:key name="dataset-by-key" match="DataSet" use="@key"/>

    <xsl:template match="/">
        <!-- iterate over all DataSet elements and select only those that are first among others with the same @key value, i.e. tricky way to do grouping = Muenchian grouping -->
        <xsl:for-each select="//DataSet[generate-id() = generate-id(key('dataset-by-key', @key)[1])]">
            <xsl:sort select="@key"/>
            <tr>
                <th class="data_header" align="left" nowrap="nowrap">
                    <xsl:text>Schlussel: </xsl:text><xsl:value-of select="@key"/>
                </th>
            </tr>

            <!-- according to definition of this key, key('dataset-by-key', @key) returns all DataSet elements where @key equals to specified value -->
            <xsl:for-each select="key('dataset-by-key', @key)">
                <xsl:sort select="@wert"/>
                <tr>
                    <td><xsl:value-of select="@orig_pk"/></td>
                    <td><xsl:copy-of select="original"/></td>
                    <td><xsl:value-of select="@dup_pk"/></td>
                    <td><xsl:copy-of select="duplikat"/></td>
                    <td><xsl:value-of select="@wert"/></td>
                </tr>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>