输入:
<persons>
<person name="John" role="Writer"/>
<person name="John" role="Poet"/>
<person name="Jacob" role="Writer"/>
<person name="Jacob" role="Poet"/>
<person name="Joe" role="Poet"/>
</persons>
预期输出:
<groups>
<group roles="Wriet, Poet" persons="John, Jacob"/>
<group roles="Poet" persons="Joe"/>
</groups>
和上面的例子一样,我首先需要对人名进行分组并找到每个人的角色。如果发现不止一个人具有相同的一组角色(例如,约翰和雅各布都是作家和诗人),那么我需要对每组角色进行分组并列出人名。
我可以使用 Muenchian 方法或 EXSLTset:distinct
等进行第一级分组。
<groups>
<group roles="Wriet, Poet" persons="John"/>
<group roles="Wriet, Poet" persons="Jacob"/>
<group roles="Poet" persons="Joe"/>
</groups>
以上是使用 XSLT 1.0 和 EXSLT 转换的:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sets="http://exslt.org/sets" extension-element-prefixes="sets">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="persons-by-name" match="person" use="@name"/>
<xsl:template match="persons">
<groups>
<xsl:for-each select="sets:distinct(person/@name)">
<group>
<xsl:attribute name="persons"><xsl:value-of select="."/></xsl:attribute>
<xsl:attribute name="roles">
<xsl:for-each select="key('persons-by-name', .)">
<xsl:value-of select="@role"/>
<xsl:if test="position()!=last()"><xsl:text>, </xsl:text></xsl:if>
</xsl:for-each>
</xsl:attribute>
</group>
</xsl:for-each>
</groups>
</xsl:template>
</xsl:stylesheet>
但是,我需要帮助来了解如何对分组角色进行分组。
如果 XSLT 1.0 解决方案不可用,请随时推荐 XSLT 2.0 方法。