假设我有一些这样的XML(下面的所有内容都已修剪,以尝试显示展示我的问题所需的最小数量(。
<Person>
<Name>Bob</Name>
<GroupID>123</GroupID>
</Person>
<Person>
<Name>Doug</Name>
<GroupID>123</GroupID>
</Person>
<Person>
<Name>Melinda</Name>
<GroupID>123</GroupID>
</Person>
<Person>
<Name>Kathy</Name>
<GroupID>22</GroupID>
</Person>
<Person>
<Name>Mark</Name>
<GroupID>22</GroupID>
</Person>
<Person>
<Name>Roberto</Name>
<GroupID>33</GroupID>
</Person>
<Person>
<Name>Carlos</Name>
</Person>
<Person>
<Name>Sasha</Name>
</Person>
我希望能够按其组 ID 对这些记录进行分组,因此输出应如下所示:
<Persons>
<Group>
<GroupID>123</GroupID>
<Person>
<Name>Bob</Name>
</Person>
<Person>
<Name>Doug</Name>
</Person>
<Person>
<Name>Melinda</Name>
</Person>
</Group>
<Group>
<GroupID>22</GroupID>
<Person>
<Name>Kathy</Name>
</Person>
<Person>
<Name>Mark</Name>
</Person>
</Group>
<Group>
<GroupID>33</GroupID>
<Person>
<Name>Roberto</Name>
</Person>
</Group>
<Group>
<Person>
<Name>Carlos</Name>
</Person>
</Group>
<Group>
<Person>
<Name>Sasha</Name>
</Person>
</Group>
</Persons>
我正在做的是这样的:
<Persons>
<xsl:for-each select="Person">
<xsl:choose>
<xsl:when test="GroupID != ''">
<xsl:variable name="groupId" select="GroupID"/>
<Group>
<GroupID>
<xsl:value-of select="groupId"/>
</GroupID>
<xsl:for-each select="../Person[GroupID = groupId]">
<xsl:call-template name="PersonData"/>
</xsl:for-each>
</Group>
</xsl:when>
<xsl:otherwise>
<Group>
<xsl:call-template name="PersonData"/>
</Group>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</Persons>
问题是每个组都会重复组中包含的人数。我真正希望能够做的是检查我是否已经处理了"当前"GroupID - 这样我就可以说"好的,这个 GroupID 已经被处理了,所以跳过它"。
编辑:这是使用XSLT 2和Xalan,所以实际上是XSLT 1。
编辑 2:一条或多条记录可能缺少 GroupID 属性。在这些情况下,这些记录应各自获得一个不存在 GroupID 的单独组。
你可以这样做:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<Persons>
<xsl:for-each-group select="//Person" group-by="GroupID">
<Group>
<GroupID><xsl:value-of select="current-grouping-key()"/></GroupID>
<xsl:for-each select="current-group()">
<Person>
<Name><xsl:value-of select="Name"/></Name>
</Person>
</xsl:for-each>
</Group>
</xsl:for-each-group>
</Persons>
</xsl:template>
</xsl:stylesheet>
在这里看到它的工作:https://xsltfiddle.liberty-development.net/a9HjZd