XSLT 1.0 分组依据
Posted
技术标签:
【中文标题】XSLT 1.0 分组依据【英文标题】:XSLT 1.0 Group By 【发布时间】:2010-12-26 14:38:48 【问题描述】:我有以下 XML 数据:
<?xml version="1.0" encoding="iso-8859-1"?>
<results>
<result>
<MemberFirstName>JOHN</MemberFirstName>
<MemberLastName>DOE</MemberLastName>
<MemberLogin>1</MemberLogin>
<Store>0180</Store>
</result>
<result>
<MemberFirstName>JANE</MemberFirstName>
<MemberLastName>DOE</MemberLastName>
<MemberLogin>2</MemberLogin>
<Store>0180</Store>
</result>
<result>
<MemberFirstName>ALAN</MemberFirstName>
<MemberLastName>SMITH</MemberLastName>
<MemberLogin>3</MemberLogin>
<Store>0181</Store>
</result>
<result>
<MemberFirstName>DAVID</MemberFirstName>
<MemberLastName>GREEN</MemberLastName>
<MemberLogin>4</MemberLogin>
<Store>0183</Store>
</result>
</results>
在 XSLT 1.0 中,我想为每个商店的员工分组并创建一个表。因此在上述数据中,将创建 3 个表。前 2 条记录有两行的表(存储 180)等。
如何在 XSLT 1.0 中做到这一点?
<table id="table">
<tr class="heading">
<th scope="col">Member Id</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
</tr>
<xsl:for-each select="results/result">
<tr>
<td><xsl:value-of select="MemberLogin"/></td>
<td><xsl:value-of select="MemberFirstName"/></td>
<td><xsl:value-of select="MemberLastName"/></td>
</tr>
</xsl:for-each>
</table>
【问题讨论】:
See similiar question-and-answer. 【参考方案1】:也许更容易理解
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/results">
<xsl:apply-templates select="result[not(preceding-sibling::result/Store = Store)]/Store" />
</xsl:template>
<xsl:template match="result" >
<tr>
<td>
<xsl:value-of select="MemberLogin"/>
</td>
<td>
<xsl:value-of select="MemberFirstName"/>
</td>
<td>
<xsl:value-of select="MemberLastName"/>
</td>
</tr>
</xsl:template>
<xsl:template match="Store" >
<table id=".">
<tr class="heading">
<th scope="col">Member Id</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
</tr>
<xsl:variable name="temp" select="." />
<xsl:apply-templates select="//result[Store = current()]" />
</table>
</xsl:template>
</xsl:stylesheet>
【讨论】:
【参考方案2】:Muenchian grouping 是最好的方法;类似:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="groups" match="/results/result" use="Store" />
<xsl:template match="/results">
<xsl:apply-templates select="result[generate-id() = generate-id(key('groups', Store)[1])]"/>
</xsl:template>
<xsl:template match="result">
<h1><xsl:value-of select="Store"/></h1>
<table id="Store">
<tr class="heading">
<th scope="col">Member Id</th>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
</tr>
<xsl:for-each select="key('groups', Store)">
<tr>
<td><xsl:value-of select="MemberLogin"/></td>
<td><xsl:value-of select="MemberFirstName"/></td>
<td><xsl:value-of select="MemberLastName"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
【讨论】:
我需要根据子节点进行分组,这样可以吗?你能按照我的xml提供样本吗? @jatin - 然后将其包含在选择器中以上是关于XSLT 1.0 分组依据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Muenchian 分组 XSLT 1.0 在每个目录中按标题分组