XSLT 1.0:按属性分组

Posted

技术标签:

【中文标题】XSLT 1.0:按属性分组【英文标题】:XSLT 1.0: Group by attribute 【发布时间】:2015-01-02 15:18:50 【问题描述】:

我有以下简化的 XML 数据,我想按类别对其进行分组:

<Root>
    <Rows>
        <Row>
            <Column name="Title" Value="Document 1"/>
            <Column name="Category" Value="Category 1"/>
        </Row>
        <Row>
            <Column name="Title" Value="Document 2"/>
            <Column name="Category" Value="Category 2"/>
        </Row>
        <Row>
            <Column name="Title" Value="Document 3"/>
            <Column name="Category" Value="Category 1"/>
        </Row>
        <Row>
            <Column name="Title" Value="Document 4"/>
            <Column name="Category" Value="Category 2"/>
        </Row>
        <Row>
            <Column name="Title" Value="Document 5"/>
            <Column name="Category" Value="Category 3"/>
        </Row>
    </Rows>
</Root>

我希望得到以下结果:

第 1 类

文档 1 文档 3

第 2 类

文档 2 文档 4

第 3 类

文件 5

我已经尝试过使用 Muenchian 分组,因为我只能使用 XSLT 1.0 ,但是没有输出:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output indent="no" method="html"/>

  <xsl:key name="groups" match="/Rows/Row" use="Column[name='Category']/@Value"/>

  <xsl:template match="/">
    <xsl:apply-templates select="Row[generate-id() = generate-id(key('groups', Column)[1])]"/>
  </xsl:template>

  <xsl:template match="Row">
    <h1>
      <xsl:value-of select="Column[name='Category']/@Value"/>
    </h1>

    <ul>
        <xsl:for-each select="key('groups', Column[name='Category']/@Value)">
            <li>
                <xsl:value-of select="Column[name='Title']/@Value"/>
            </li>
        </xsl:for-each>
    </ul>
  </xsl:template>
</xsl:stylesheet>

我没有找到按名称是另一个属性的属性进行分组的解决方案。我的错在哪里,还是有更好的解决方案?提前致谢

【问题讨论】:

您似乎忽略了 &lt;Root&gt; 是您的***标签这一事实。请尝试:&lt;xsl:key name="groups" match="/Root/Rows/Row" use="Column[name='Category']/@Value"/&gt;&lt;xsl:template match="/Root"&gt; 也许这是另一个问题,但这并没有解决问题。还是没有输出 【参考方案1】:

比较:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output indent="no" method="html"/>

  <xsl:key name="groups" match="Row" use="Column[@name='Category']/@Value"/>

  <xsl:template match="/">
    <xsl:apply-templates select="Root/Rows/Row[generate-id() = generate-id(key('groups', Column/@Value)[1])]"/>
  </xsl:template>

  <xsl:template match="Row">
    <h1>
      <xsl:value-of select="Column[@name='Category']/@Value"/>
    </h1>

    <ul>
        <xsl:for-each select="key('groups', Column[@name='Category']/@Value)">
            <li>
                <xsl:value-of select="Column[@name='Title']/@Value"/>
            </li>
        </xsl:for-each>
    </ul>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

以上是关于XSLT 1.0:按属性分组的主要内容,如果未能解决你的问题,请参考以下文章

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

XSLT 1.0 - 连接已知子节点,按未知父节点分组

XSLT 按唯一参数分组

xslt 1.0 使用复合键分组(在不同级别)

我无法理解 XSLT 1.0 Muenchian 分组

选择属性的所有值并使用 XSLT 1.0 作为列表返回