我有以下简化的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分组中尝试过了,因为我只能使用XSLT1.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>
我找不到按名称是另一个属性的属性分组的解决方案。我的错在哪里?或者有更好的解决方案吗?提前感谢
比较:
<?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>