ввода:Группировка сгруппированных данных
<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 или EXSLT set: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.
Можете ли вы показать XSLT вы в настоящее время используете, чтобы получить свой текущий результат? Благодаря! –
@TimC Конечно, добавлена версия EXSLT в моем вопросе. – Somu