XSLT1.0按子节点的值对xml节点进行分组
我正在使用XSLT1.0 我有一个输入消息,我正在尝试转换。 此输入消息具有以下冗余结构,由4种类型的节点A、B、Order、Article、组成,它们的顺序始终相同:XSLT1.0按子节点的值对xml节点进行分组,xml,xslt,mapping,xslt-1.0,biztalk,Xml,Xslt,Mapping,Xslt 1.0,Biztalk,我正在使用XSLT1.0 我有一个输入消息,我正在尝试转换。 此输入消息具有以下冗余结构,由4种类型的节点A、B、Order、Article、组成,它们的顺序始终相同: A B Order0 Article100 A B Order1 Article101 A B Order0 Article102 ... <Messages> <Message> <A> <Number>100</Numbe
A
B
Order0
Article100
A
B
Order1
Article101
A
B
Order0
Article102
...
<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>
我希望将节点分组以生成以下输出:
A
B
Order0
Article100
Article102
A
B
Order1
Article101
A
B
在输出中,我不想要任何重复的Order
节点;不应移动节点A
和B
下面是完整的XML消息。
分组的键是顺序
节点内的字段键
输入:
A
B
Order0
Article100
A
B
Order1
Article101
A
B
Order0
Article102
...
<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>
100
一些数据
一些数据
100
一些数据
一些数据
100
一些数据
一些数据
78
一些数据
一些数据
600
一些数据
一些数据
601
一些数据
一些数据
101
一些数据
一些数据
55
一些数据
一些数据
799
一些数据
一些数据
798
一些数据
一些数据
100
一些数据
一些数据
32
一些数据
一些数据
输出:
A
B
Order0
Article100
A
B
Order1
Article101
A
B
Order0
Article102
...
<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>
100
一些数据
一些数据
100
一些数据
一些数据
100
一些数据
一些数据
78
一些数据
一些数据
32
一些数据
一些数据
600
一些数据
一些数据
601
一些数据
一些数据
101
一些数据
一些数据
55
一些数据
一些数据
799
一些数据
一些数据
798
一些数据
一些数据
我曾考虑使用明钦教的分组,但没有成功。
我不太确定这就是我要找的
这是用于Biztalk映射的,因此我还可以使用Biztalk映射和functoid。这里有一种方法可以查看它(我认为): XSLT1.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>
Biztalk 2020不也允许XSLT 3吗?很遗憾,我们没有最新版本的Biztalk。这很好,谢谢!我刚刚发现,在向输入文档添加名称空间时,即使在xsl中指定名称空间,该样式表也不再有效。我发现有人有完全相同的问题:当然没有-看看这里为什么:。