使用 XSLT 1.0 对值进行分组

Posted

技术标签:

【中文标题】使用 XSLT 1.0 对值进行分组【英文标题】:Group values with XSLT 1.0 【发布时间】:2016-01-25 05:41:34 【问题描述】:

希望你能帮助我;

我有这个 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 对这些值进行分组,并在每个组上方呈现一个新的&lt;tr&gt;

<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,我无法使用 &lt;xsl:for-each-group&gt;,而且我只能在 xsl 中做一些简单的事情,我无法使用 Muenchian method 来做到这一点。

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

非常感谢您提前。

【问题讨论】:

你能告诉你输入的 XML 和在这种情况下你期望的输出吗?不要害怕 Muenchian Grouping 方法。如果您使用的是 XSLT 1.0,那么值得尝试和学习。请参阅 jenitennison.com/xslt/grouping/muenchian.html 了解其工作原理。 @TimC 谢谢鼓励,我自己搞定了 【参考方案1】:
<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>

【讨论】:

谢谢你,照你的做,但是忘记贴了^^ 所以,你可以看到它很简单!

以上是关于使用 XSLT 1.0 对值进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在下面的 XSLT 1.0 代码中进行分组。需要按 TaxRateCode 分组

如何使用 Muenchian 分组 XSLT 1.0 在每个目录中按标题分组

是否可以使用 XSLT 1.0 对条目进行分组?

XSLT 1.0 对节点进行分组和计数

XSLT 1.0 按子节点的值对 xml 节点进行分组

xslt 1.0中的嵌套分组