Как использовать group by в xslt - PullRequest
       20

Как использовать group by в xslt

5 голосов
/ 25 февраля 2010

У меня есть xml, в котором так много элементов, и большинство из них содержат атрибуты ... для некоторых значений атрибутов одинаковые, поэтому мне нужно сгруппировать их и сгенерировать diff xml. I / p Ex:

<TestNode>
 <ABC1 value="10.7" format="$" />
 <ABC2 value="10.5" format="$" />
 <ABC3 value="20" format="Rs" />
 <ABC4 value="50" format="Rs" />
 <ABC5 value="10.5" format="$" />
</TestNode>

Мне нужно сгруппировать строки по формату. Примечание: формат не зафиксирован ... он может увеличиться ... O / P Пример: можно ли получить? Заранее спасибо ...

Ответы [ 2 ]

5 голосов
/ 25 февраля 2010

В XSLT 1.0 вы бы использовали мюнхенскую группировку.

Определите ключевой «формат», из которого мы можем легко выбрать все элементы с заданным именем формата. Чем применить мюнхенскую группировку для поиска уникальных форматов во входных данных.

Тогда все становится просто. Шаблон «*» будет применен один раз для каждого формата и использует ключ () для извлечения всех записей для этого формата.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />

    <xsl:key name="format" match="TestNode/*" use="@format" />

    <xsl:template match="TestNode">
        <body>
            <xsl:apply-templates select="*[generate-id(.)=generate-id(key('format',@format)[1])]"/>
        </body>
    </xsl:template>

    <xsl:template match="*">
        <format format="{@format}">
          <xsl:copy-of select="key('format', @format)" />
        </format>
    </xsl:template>

</xsl:stylesheet>
4 голосов
/ 25 февраля 2010

В XSLT 2.0 вы сможете сделать это с <xsl:for-each-group>, current-grouping-key() и current-group()

Пример:

<xsl:for-each-group 
    select="TestNode/*"
    group-by="@format"
>
    <group format="{current-grouping-key()}">
        <xsl:for-each select="current-group()">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </group>
</xsl:for-each-group>

См .: http://www.w3.org/TR/xslt20/#grouping

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...