Группировка ребенка после сортировки XSLT - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь сгруппировать некоторые данные, которые я уже отсортировал, добавив другую группу после родительского элемента «Events».

Вот мой код, где у меня уже работает функция сортировки, мне просто интересно, какдобавить еще одну группу в разделе «События», прежде чем она сортируется.Любая помощь приветствуется, так как я новичок в XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Games">
        <xsl:copy>
            <xsl:apply-templates select="Game/Event[@type_id='1' and @team_id='8']">
                <xsl:sort select="event_id" order="ascending" data-type="number"  />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 10 февраля 2019

Группировать довольно легко, если вы можете использовать XSLT 2.0 .

Предположим, что ваш ввод выглядит примерно так:

<Games>
  <Game id="g1">
    <Event event_id="34" xx="1">Abcd 1</Event>
    <Event event_id="33" xx="1">Abcd 2</Event>
    <Event event_id="32" xx="2">Abcd 3</Event>
    <Event event_id="31" xx="2">Abcd 4</Event>
  </Game>
  <Game id="g2">
    <Event event_id="24" xx="1">Efgh 1</Event>
    <Event event_id="23" xx="1">Efgh 2</Event>
    <Event event_id="22" xx="2">Efgh 3</Event>
    <Event event_id="21" xx="2">Efgh 4</Event>
  </Game>
  <Game id="g3">
    <Event event_id="14" xx="1">Ijkl 1</Event>
    <Event event_id="13" xx="1">Ijkl 2</Event>
    <Event event_id="12" xx="2">Ijkl 3</Event>
    <Event event_id="11" xx="2">Ijkl 4</Event>
  </Game>
</Games>

Предположим, что вы хотите, например:для группировки событий по атрибуту xx.

Тогда вы можете использовать xsl:for-each-group.Атрибут select указывает исходные объекты для группы (Game/Event).Атрибут group-by указывает метод группировки, на этот раз by @xx (есть еще 3 метода).

Пример сценария может быть таким, как показано ниже:

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

  <xsl:template match="Games">
    <xsl:copy>
      <xsl:for-each-group select="Game/Event" group-by="@xx">
        <Group><xsl:value-of select="current-grouping-key()"/></Group>
        <xsl:apply-templates select="current-group()">
          <xsl:sort select="@event_id" order="ascending" data-type="number"  />
        </xsl:apply-templates>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Чтобы упростить задачуЯ удалил предикат относительно type_id и team_id.Для демонстрации я добавил дополнительный выходной элемент в качестве заголовка каждой группы.

Рабочий пример см. http://xsltransform.net/gVAjbSW

Если вам нужно использовать XSLT 1.0 поищите в Интернете мюнхенская группировка .Это в некоторой степени более сложная задача, но все же возможно.Есть множество примеров, даже на StackOverflow .

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