如果输出已包含类似的元素,则跳过 XSLT 中的元素



假设我有一些这样的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

最新更新