XSLT с группировкой и групповыми итогами - PullRequest
1 голос
/ 28 декабря 2011

У меня есть следующие данные XML. У меня нет контроля над структурой этих данных, вот как я их получаю.

<data>
  <row>
    <value name="CustomerID">1</value>
    <value name="CustomerName">Joe</value>
    <value name="Cost">22.50</value>
  </row>
  <row>
    <value name="CustomerID">1</value>
    <value name="CustomerName">Joe</value>
    <value name="Cost">55.50</value>
  </row>
  <row>
    <value name="CustomerID">2</value>
    <value name="CustomerName">Jane</value>
    <value name="Cost">10</value>
  </row>
  <row>
    <value name="CustomerID">2</value>
    <value name="CustomerName">Jane</value>
    <value name="Cost">13.50</value>
  </row>
    <row>
    <value name="CustomerID">3</value>
    <value name="CustomerName">Jim</value>
    <value name="Cost">50</value>
  </row>
</data>

Мне нужно использовать XSLT v1.0 для отображения данных, сгруппированных по идентификатору клиента и общей сумме для каждого клиента. Я пробовал искать во многих статьях, но ничто не имеет такой странной структуры.

1 Ответ

3 голосов
/ 28 декабря 2011

Использование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:key name="k" match="row" use="value[@name = 'CustomerID']"/>

    <xsl:template match="data">
        <xsl:copy>
            <xsl:apply-templates select="row[generate-id(.) = generate-id(key('k', value[@name = 'CustomerID']))]"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="row">
        <xsl:copy>
            <xsl:copy-of select="value[@name = 'CustomerID']"/>
            <xsl:copy-of select="value[@name = 'CustomerName']"/>
            <sum>
                <xsl:value-of select="sum(key('k', value[@name = 'CustomerID'])/value[@name = 'Cost'])"/>
            </sum>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<data>
  <row>
    <value name="CustomerID">1</value>
    <value name="CustomerName">Joe</value>
    <sum>78</sum>
  </row>
  <row>
    <value name="CustomerID">2</value>
    <value name="CustomerName">Jane</value>
    <sum>23.5</sum>
  </row>
  <row>
    <value name="CustomerID">3</value>
    <value name="CustomerName">Jim</value>
    <sum>50</sum>
  </row>
</data>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...