Группировка по элементу и сумме значений XSLT - PullRequest
0 голосов
/ 18 апреля 2020

Я новичок в XSLT и застрял в проблеме. Я сделал некоторые поиски, которые я прочитал о мюнхенской группировке, но я не знаю, как использовать это в этой проблеме.

Я пытаюсь написать код в XSLT для чтения каждого teamName и суммирования целей каждой команды. Я использую XML v 1.0

Ниже приведен мой текущий файл данных в XML:

<footballLeague>
    <round num="1">
        <match>
            <local>
                <teamName>AA</teamName>
                <goals>0</goals>
            </local>
            <visitor>
                <teamName>BB</teamName>
                <goals>1</goals>
            </visitor>
        </match>
        <match>
            <local>
                <teamName>CC</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>DD</teamName>
                <goals>0</goals>
            </visitor>
        </match>
    </round>
    <round num="2">
        <match>
            <local>
                <teamName>DD</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>AA</teamName>
                <goals>1</goals>
            </visitor>
        </match>
        <match>
            <local>
                <teamName>BB</teamName>
                <goals>0</goals>
            </local>
            <visitor>
                <teamName>CC</teamName>
                <goals>1</goals>
            </visitor>
        </match>
    </round>
    <round num="3">
        <match>
            <local>
                <teamName>DD</teamName>
                <goals>0</goals>
            </local>
            <visitor>
                <teamName>BB</teamName>
                <goals>1</goals>
            </visitor>
        </match>
        <match>
            <local>
                <teamName>CC</teamName>
                <goals>0</goals>
            </local>
            <visitor>
                <teamName>AA</teamName>
                <goals>1</goals>
            </visitor>
        </match>
    </round>
    <round num="4">
        <match>
            <local>
                <teamName>BB</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>AA</teamName>
                <goals>0</goals>
            </visitor>
        </match>
        <match>
            <local>
                <teamName>DD</teamName>
                <goals>0</goals>
            </local>
            <visitor>
                <teamName>CC</teamName>
                <goals>1</goals>
            </visitor>
        </match>
    </round>
    <round num="5">
        <match>
            <local>
                <teamName>AA</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>DD</teamName>
                <goals>1</goals>
            </visitor>
        </match>
        <match>
            <local>
                <teamName>CC</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>BB</teamName>
                <goals>1</goals>
            </visitor>
        </match>
    </round>
    <round num="6">
        <match>
            <local>
                <teamName>BB</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>DD</teamName>
                <goals>0</goals>
            </visitor>
        </match>
        <match>
            <local>
                <teamName>AA</teamName>
                <goals>1</goals>
            </local>
            <visitor>
                <teamName>CC</teamName>
                <goals>0</goals>
            </visitor>
        </match>
    </round>
</footballLeague>

Результат, который я хотел бы получить после запуска XSLT:

Team Name | Goals For | Goals against | Games Won | Tied Matches
    AA    |      4    |        4      |      2    |      2
    BB    |      5    |        2      |      4    |      1
    CC    |      4    |        3      |      3    |      1
    DD    |      2    |        6      |      0    |      2

Любая помощь, с которой я мог бы начать, была бы фантастична c!

1 Ответ

0 голосов
/ 18 апреля 2020

Посмотрите, может ли это помочь вам начать:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="score" match="local|visitor" use="teamName" />

<xsl:template match="footballLeague">
    <stats> 
        <xsl:for-each select="round/match/*[count(. | key('score', teamName)[1]) = 1]">
            <team>
                <xsl:copy-of select="teamName"/>
                <goals-for>
                    <xsl:value-of select="sum(key('score', teamName)/goals)"/>
                </goals-for>
                <goals-against>
                    <xsl:value-of select="sum(key('score', teamName)[self::local]/../visitor/goals) + sum(key('score', teamName)[self::visitor]/../local/goals)"/>
                </goals-against>
            </team>
        </xsl:for-each>
    </stats>
</xsl:template>

</xsl:stylesheet>

Применительно к вашему примеру результат будет:

<?xml version="1.0" encoding="UTF-8"?>
<stats>
  <team>
    <teamName>AA</teamName>
    <goals-for>4</goals-for>
    <goals-against>4</goals-against>
  </team>
  <team>
    <teamName>BB</teamName>
    <goals-for>5</goals-for>
    <goals-against>2</goals-against>
  </team>
  <team>
    <teamName>CC</teamName>
    <goals-for>4</goals-for>
    <goals-against>3</goals-against>
  </team>
  <team>
    <teamName>DD</teamName>
    <goals-for>2</goals-for>
    <goals-against>6</goals-against>
  </team>
</stats>
...