在 xslt1 中按 xml 元素对重复节点进行 xsl 分组 [英] xsl grouping of repetitive nodes by xml element in xslt1
问题描述
我有一个复杂的 xml 结构,看起来像:
I have a complex xml structure that looks like :
<Items>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description11</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description12</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description11</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description12</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description11</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description12</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type3</ItemTextsType>
<ItemTextsTypeDesc>description31</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type3</ItemTextsType>
<ItemTextsTypeDesc>description32</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
</Items>
我在每个项目上使用 xsl 运行,例如:
I run with xsl on each Item like :
<xsl:for-each select="Items/Item">
我需要一个示例,说明如何按
为每个
单独分组
所以结果会是这样的:
I need an example of how to group <ItemText>
by <ItemTextsType>
individually for each <Item>
so the outcome will be like :
对于本例中的第一个
:
For first <Item>
in this example :
type1
description11
description12
type2
description21
description21
description22
description22
对于本例中的第二个 Item
:
For second Item
in this example :
type3
description31
description32
type2
description21
description21
description22
description22
当然我会把结果安排在一个表格中:
of course I will arrange the outcome in a table like :
<table width="100%" border="1" style="display: block;">
<tbody>
<tr>
<td id="SelectedRowLinkageContents">
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">
Item1
</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type1
</td>
</tr>
<tr>
<td>
desription11
</td>
</tr>
<tr>
<td>
desription12
</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type2
</td>
</tr>
<tr>
<td>
desription21
</td>
</tr>
<tr>
<td>
desription22
</td>
</tr>
<tr>
<td>
desription23
</td>
</tr>
</tbody>
</table>
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">
Item2
</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type1
</td>
</tr>
<tr>
<td>
desription11
</td>
</tr>
<tr>
<td>
desription12
</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type2
</td>
</tr>
<tr>
<td>
desription21
</td>
</tr>
<tr>
<td>
desription23
</td>
</tr>
</tbody>
</table>
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">
Item3
</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type1
</td>
</tr>
<tr>
<td>
desription11
</td>
</tr>
<tr>
<td>
desription12
</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type2
</td>
</tr>
<tr>
<td>
desription21
</td>
</tr>
<tr>
<td>
desription23
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
关键是每个 The point is that there is separate grouping for each 我尝试过类似的东西 但它只适用于非重复节点(如果只有一个 but it only work on non repetitive nodes (if there were only one 请帮帮我,我需要尽快. Please help me , I need it ASAP . 谢谢!!!! 由于一些差异,仍然很难说出所需的解决方案 - 例如,您输入的 XML 有 4 个 It's still difficult to tell what the desired solution is due to some discrepancies - for instance, your input XML has 4 也就是说,如果我们专注于您陈述的理想解决方案: That said, if we focus on your stated desired solution: "重点是每个 "The point is that there is separate grouping for each ...那么这应该会让你朝着正确的方向前进. ...then this ought to get you in the right direction. 当这个 XSLT: ...应用于提供的输入 XML: ...想要的结果(我认为)产生了: ...在 HTML 页面中呈现时,如下所示: 这篇关于在 xslt1 中按 xml 元素对重复节点进行 xsl 分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
都有单独的分组到它自己的和
中代码> 按
<Item>
into it's own <table>
and inside that <table>
there is groupping by <ItemTextsType>
<xsl:key name="item-texts-type" match="ItemText" use="ItemTextsType" />
<xsl:for-each select="ItemTexts/ItemText[count(. | key('item-texts-type', ItemTextsType)[1]) = 1]">
<xsl:sort select="ItemTextsType" />
<tr>
<td style ="height:35px;font: bold; color:#507CD1;">
<xsl:value-of select="ItemTextsType" />
</td>
</tr>
<xsl:for-each select="key('item-texts-type', ItemTextsType)">
<tr>
<td>
<xsl:value-of select="ItemTextsTypeDesc" />
</td>
</tr>
</xsl:for-each>
</xsl:for-each>
它会正常工作).我无法更改 xml,因为它来自客户.<Item>
it would work fine).
I can't change xml because it comes from customer .推荐答案
元素,但您想要的输出只考虑其中的 3 个.此外,您所需输出中的一些描述与其在输入 XML 文档中的预期位置不匹配.<Item>
elements, but your desired output only takes 3 of them into account. Additionally, several descriptions in your desired output do not match up with their expected location in the input XML document.
都有单独的分组它是自己的 并且在那个
里面有分组
"
<Item>
into
it's own <table>
and inside that <table>
there is groupping by
<ItemTextsType>
"<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key
name="kItemTextByType"
match="ItemText"
use="concat(generate-id(ancestor::Item[1]), '+', ItemTextsType)" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<table width="100%" border="1" style="display: block;">
<tbody>
<tr>
<td id="SelectedRowLinkageContents">
<xsl:apply-templates />
</td>
</tr>
</tbody>
</table>
</xsl:template>
<xsl:template match="Item">
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">
<xsl:value-of select="concat('Item', position())" />
</td>
</tr>
<xsl:apply-templates
select="ItemTexts/ItemText[
generate-id() =
generate-id(
key(
'kItemTextByType',
concat(generate-id(current()), '+', ItemTextsType)
)[1]
)
]">
<xsl:sort select="ItemTextsType" />
</xsl:apply-templates>
</tbody>
</table>
</xsl:template>
<xsl:template match="ItemText">
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
<xsl:value-of select="ItemTextsType" />
</td>
</tr>
<xsl:for-each
select="key(
'kItemTextByType',
concat(
generate-id(ancestor::Item[1]),
'+',
ItemTextsType
)
)"
>
<xsl:sort select="ItemTextsTypeDesc" />
<tr>
<td>
<xsl:value-of select="ItemTextsTypeDesc" />
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<Items>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description11</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description12</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description11</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description12</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description11</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type1</ItemTextsType>
<ItemTextsTypeDesc>description12</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
<Item>
<ItemTexts>
<ItemText>
<ItemTextsType>type3</ItemTextsType>
<ItemTextsTypeDesc>description31</ItemTextsTypeDesc>
<ItemTextsLine>1</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type3</ItemTextsType>
<ItemTextsTypeDesc>description32</ItemTextsTypeDesc>
<ItemTextsLine>2</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description21</ItemTextsTypeDesc>
<ItemTextsLine>3</ItemTextsLine>
</ItemText>
<ItemText>
<ItemTextsType>type2</ItemTextsType>
<ItemTextsTypeDesc>description22</ItemTextsTypeDesc>
<ItemTextsLine>4</ItemTextsLine>
</ItemText>
</ItemTexts>
</Item>
</Items>
<table width="100%" border="1" style="display: block;">
<tbody>
<tr>
<td id="SelectedRowLinkageContents">
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">Item1</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type1</td>
</tr>
<tr>
<td>description11</td>
</tr>
<tr>
<td>description12</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type2</td>
</tr>
<tr>
<td>description21</td>
</tr>
<tr>
<td>description22</td>
</tr>
</tbody>
</table>
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">Item2</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type1</td>
</tr>
<tr>
<td>description11</td>
</tr>
<tr>
<td>description12</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type2</td>
</tr>
<tr>
<td>description21</td>
</tr>
<tr>
<td>description22</td>
</tr>
</tbody>
</table>
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">Item3</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type1</td>
</tr>
<tr>
<td>description11</td>
</tr>
<tr>
<td>description12</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type2</td>
</tr>
<tr>
<td>description21</td>
</tr>
<tr>
<td>description22</td>
</tr>
</tbody>
</table>
<table width="100%" dir="ltr">
<tbody>
<tr style="background-color: #507CD1; text-align: center">
<td colspan="3" style="font: bold; color: white">Item4</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">type2</td>
</tr>
<tr>
<td>description21</td>
</tr>
<tr>
<td>description22</td>
</tr>
<tr>
<td style="height: 35px; font: bold; color: #507CD1;">
type3</td>
</tr>
<tr>
<td>description31</td>
</tr>
<tr>
<td>description32</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
登录
关闭