XSLT 1.0 按子节点的值对 xml 个节点进行分组
XSLT 1.0 Grouping xml nodes by value of a child
我正在使用 XSLT 1.0
我有一条要转换的输入消息。
此输入消息具有以下冗余结构,由4种类型的节点A、B、Order、Article组成,始终保持相同的顺序:
A
B
Order0
Article100
A
B
Order1
Article101
A
B
Order0
Article102
...
我想对节点进行分组以产生以下输出:
A
B
Order0
Article100
Article102
A
B
Order1
Article101
A
B
在输出中,我不想要 Order
节点的任何副本;不应移动节点 A
和 B
。
这里是完整的 XML 消息。
分组的关键是 Order
节点
内部的字段 Key
输入:
<Messages>
<Message>
<A>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>100</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>78</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>600</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>601</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>101</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>55</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>799</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>798</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>100</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>32</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
</Messages>
输出:
<Messages>
<Message>
<A>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>100</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>78</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<Article>
<Key>32</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>600</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>601</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>101</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>55</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>799</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>798</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
</Messages>
我正在考虑使用 Muenchian 分组但没有成功。
我不太确定这是我要找的。
这是针对 Biztalk 映射的,因此我也可以使用 Biztalk 映射和 functoid。
这是您可以查看的一种方式(我认为):
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="order" match="Message[Order]" use="Order/Key" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Message[Order]">
<xsl:if test="count(. | key('order', Order/Key)[1]) = 1">
<xsl:copy-of select="."/>
<xsl:copy-of select="key('order', Order/Key)/following-sibling::Message[1]"/>
</xsl:if>
</xsl:template>
<xsl:template match="Message[Article]"/>
</xsl:stylesheet>
我正在使用 XSLT 1.0
我有一条要转换的输入消息。 此输入消息具有以下冗余结构,由4种类型的节点A、B、Order、Article组成,始终保持相同的顺序:
A
B
Order0
Article100
A
B
Order1
Article101
A
B
Order0
Article102
...
我想对节点进行分组以产生以下输出:
A
B
Order0
Article100
Article102
A
B
Order1
Article101
A
B
在输出中,我不想要 Order
节点的任何副本;不应移动节点 A
和 B
。
这里是完整的 XML 消息。
分组的关键是 Order
节点
Key
输入:
<Messages>
<Message>
<A>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>100</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>78</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>600</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>601</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>101</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>55</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>799</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>798</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>100</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>32</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
</Messages>
输出:
<Messages>
<Message>
<A>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>100</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>100</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>78</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<Article>
<Key>32</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>600</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>601</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
<Message>
<Order>
<Key>101</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Order>
</Message>
<Message>
<Article>
<Key>55</Key>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</Article>
</Message>
<Message>
<A>
<Number>799</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</A>
</Message>
<Message>
<B>
<Number>798</Number>
<SomeData>somedata</SomeData>
<SomeData2>somedata</SomeData2>
</B>
</Message>
</Messages>
我正在考虑使用 Muenchian 分组但没有成功。 我不太确定这是我要找的。
这是针对 Biztalk 映射的,因此我也可以使用 Biztalk 映射和 functoid。
这是您可以查看的一种方式(我认为):
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="order" match="Message[Order]" use="Order/Key" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Message[Order]">
<xsl:if test="count(. | key('order', Order/Key)[1]) = 1">
<xsl:copy-of select="."/>
<xsl:copy-of select="key('order', Order/Key)/following-sibling::Message[1]"/>
</xsl:if>
</xsl:template>
<xsl:template match="Message[Article]"/>
</xsl:stylesheet>