Xml XSLT Muenchian分组嵌套行和列
我正在使用XSLT1.0。我的XML文件中有Xml XSLT Muenchian分组嵌套行和列,xml,xslt,muenchian-grouping,Xml,Xslt,Muenchian Grouping,我正在使用XSLT1.0。我的XML文件中有和元素。RowBreak将按行对数据分组,而ColumnBreak将转换为列。只要ColumnBreak或RowBreak不匹配,显示就应该继续向下 以下是我的XML: <?xml version="1.0" encoding="utf-8" ?> <Tree> <Item> <Label>Item 1</Label> </Item> <Item>
和
元素。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>
编辑:
这是我更新的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>
如何使用Muenchian分组实现预期输出?谢谢 如果对输入XML应用此样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="html" version="5.0" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Tree">
<table>
<!-- process the first row -->
<xsl:call-template name="process_first_group">
<xsl:with-param name="group" select="*[not(preceding-sibling::RowBreak)
and not(self::RowBreak)]"/>
</xsl:call-template>
<xsl:apply-templates select="RowBreak"/>
</table>
</xsl:template>
<!-- succeeding rows that start with RowBreak -->
<xsl:template match="RowBreak">
<xsl:variable name="row_ID" select="generate-id()"/>
<xsl:variable name="prec_Col" select="count(preceding-sibling::ColumnBreak)"/>
<xsl:call-template name="process_other_group">
<xsl:with-param name="group" select="following-sibling::*[not(self::RowBreak)]
[preceding-sibling::RowBreak[1]
[generate-id()=$row_ID]
]"/>
<xsl:with-param name="row_ID" select="$row_ID"/>
<xsl:with-param name="prec_Col" select="$prec_Col"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="process_first_group">
<xsl:param name="group"/>
<xsl:for-each select="$group[self::Item[not(preceding-sibling::ColumnBreak)]]">
<xsl:variable name="pos" select="position()"/>
<tr>
<td>
<xsl:value-of select="."/>
</td>
<xsl:for-each select="following-sibling::ColumnBreak">
<xsl:variable name="col_ID" select="generate-id()"/>
<xsl:apply-templates select="$group[self::Item
[preceding-sibling::ColumnBreak[1]
[generate-id()=$col_ID]
]
[position()=$pos]
]"/>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template name="process_other_group">
<xsl:param name="group"/>
<xsl:param name="row_ID"/>
<xsl:param name="prec_Col"/>
<xsl:for-each select="$group[self::Item[count(preceding-sibling::ColumnBreak)=$prec_Col]]">
<xsl:variable name="pos" select="position()"/>
<tr>
<td>
<xsl:value-of select="."/>
</td>
<xsl:for-each select="$group[self::ColumnBreak[preceding-sibling::RowBreak[generate-id()=$row_ID]]]">
<xsl:variable name="col_ID" select="generate-id()"/>
<xsl:apply-templates select="following-sibling::Item[preceding-sibling::ColumnBreak[1][generate-id()=$col_ID] and preceding-sibling::RowBreak[1][generate-id()=$row_ID]][position()=$pos]"/>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:template>
<xsl:template match="Item">
<td><xsl:apply-templates/></td>
</xsl:template>
<xsl:template match="Label">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
你会得到
<table>
<tr>
<td>Item 1</td>
<td>Item 3</td>
</tr>
<tr>
<td>Item 2</td>
</tr>
<tr>
<td>Item 4</td>
<td>Item 6</td>
<td>Item 8</td>
</tr>
<tr>
<td>Item 5</td>
<td>Item 7</td>
</tr>
<tr>
<td>Item 9</td>
</tr>
<tr>
<td>Item 10</td>
</tr>
</table>
项目1
项目3
项目2
项目4
项目6
项目8
项目5
项目7
项目9
项目10
在行动中看到它谢谢。我将在您的代码中做一些调整,因为有一个用例失败了。例如,XML中没有,在第5项和第6项之间存在。预期的输出应该是两列,第一列是第1-5项,第二列是第6-10项。我已经添加了一些修改,但这仍然需要改进。谢谢乔尔,但我还是没能成功。我已经更新了我的XSLT和场景。请试试这个。是的,我忘了说这是在处理给定的输入XML。但是,逻辑已经存在,您只需自己修改脚本即可。
<table>
<tr>
<td>Item 1</td>
<td>Item 3</td>
</tr>
<tr>
<td>Item 2</td>
</tr>
<tr>
<td>Item 4</td>
<td>Item 6</td>
<td>Item 8</td>
</tr>
<tr>
<td>Item 5</td>
<td>Item 7</td>
</tr>
<tr>
<td>Item 9</td>
</tr>
<tr>
<td>Item 10</td>
</tr>
</table>