Я использую XSLT 1.0.В моем файле XML есть элементы <RowBreak>
и <ColumnBreak>
.RowBreak сгруппирует мои данные по строкам, а ColumnBreak преобразует в столбцы.Пока нет совпадений для ColumnBreak или RowBreak, отображение должно продолжаться вниз.
Вот мой XML:
<?xml version="1.0" encoding="utf-8" ?>
<Tree>
<Item>
<Label>Item 1</Label>
</Item>
<Item>
<Label>Item 2</Label>
</Item>
<ColumnBreak />
<Item>
<Label>Item 3</Label>
</Item>
<Item>
<Label>Item 4</Label>
</Item>
<Item>
<Label>Item 5</Label>
</Item>
<RowBreak />
<Item>
<Label>Item 6</Label>
</Item>
<Item>
<Label>Item 7</Label>
</Item>
<ColumnBreak />
<Item>
<Label>Item 8</Label>
</Item>
<RowBreak />
<Item>
<Label>Item 9</Label>
</Item>
<Item>
<Label>Item 10</Label>
</Item>
</Tree>
Ожидаемый вывод:
Item 1 Item 3
Item 2 Item 4
Item 5
Item 6 Item 8
Item 7
Item 9
Item 10
РЕДАКТИРОВАТЬ: Вот мой обновленный XSLT.Я все еще не мог понять, как сделать вложенную группировку.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:key name="rowGroups" match="Tree/*[not(self::RowBreak)]" use="count(preceding-sibling::RowBreak)" />
<xsl:template match="Tree">
<xsl:variable name="rowGroupings" select="*[not(self::RowBreak)][generate-id() = generate-id(key('rowGroups', count(preceding-sibling::RowBreak))[1])]" />
<xsl:variable name="position" select="position()" />
<table>
<xsl:for-each select="$rowGroupings">
<xsl:variable name="rowId" select="generate-id()"/>
<xsl:variable name="colGroupings" select="$rowGroupings[not(self::ColumnBreak)][generate-id()=$rowId][1]" />
<tr>
<td>
<xsl:for-each select="$colGroupings">
<xsl:sort select="$colGroupings[preceding-sibling::ColumnBreak]" order="descending" />
<xsl:if test="position() = 1">
<xsl:variable name="maxRows" select="$colGroupings[preceding-sibling::ColumnBreak]" />
<xsl:call-template name="ColumnGroupTemplate">
<xsl:with-param name="maxRows" select="$maxRows" />
<xsl:with-param name="colGroupings" select="$colGroupings" />
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="ColumnGroupTemplate">
<xsl:param name="maxRows" />
<xsl:param name="colGroupings" />
<xsl:for-each select="$maxRows">
<xsl:variable name="position" select="position()" />
<tr>
<xsl:for-each select="$colGroupings">
<xsl:variable name="group" select="$colGroupings[preceding-sibling::ColumnBreak]" />
<td>
<xsl:value-of select="normalize-space($colGroupings[position() = $position])" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Как мне достичь ожидаемого результата, используя группировку Мюнхена?Спасибо!