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>
我没有找到按名称是另一个属性的属性进行分组的解决方案。我的错在哪里,还是有更好的解决方案?提前致谢
【问题讨论】:
您似乎忽略了<Root>
是您的***标签这一事实。请尝试:<xsl:key name="groups" match="/Root/Rows/Row" use="Column[name='Category']/@Value"/>
和 <xsl:template match="/Root">
。
也许这是另一个问题,但这并没有解决问题。还是没有输出
【参考方案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:按属性分组的主要内容,如果未能解决你的问题,请参考以下文章