【问题标题】:XSLT 1.0 Grouping xml nodes by value of a childXSLT 1.0 按子节点的值对 xml 节点进行分组
【发布时间】:2021-03-14 10:22:20
【问题描述】:

我正在使用 XSLT 1.0

我有一条正在尝试转换的输入消息。 此输入消息具有以下冗余结构,由 A、B、Order、Article 4 种类型的节点组成,它们始终处于相同的顺序

A
B
Order0
Article100
A
B
Order1
Article101
A
B
Order0
Article102
...

我想对节点进行分组以产生以下输出:

A
B
Order0
Article100
Article102
A
B
Order1
Article101
A
B

在输出中,我不希望有任何重复的 Order 节点;不应移动节点 AB

这里是完整的 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 分组,但没有成功。 我不太确定这是我要找的。​​p>

这是一个 Biztalk 映射,所以我也可以使用 Biztalk 映射和 functoids。

【问题讨论】:

  • Biztalk 2020 不也允许 XSLT 3 吗?
  • 很遗憾我们没有最新版本的 Biztalk

标签: xml xslt mapping xslt-1.0 biztalk


【解决方案1】:

这是你可以看到的一种方式(我认为):

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>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 2014-06-10
  • 2021-12-05
  • 2012-08-07
  • 2023-03-18
  • 1970-01-01
  • 2014-09-02
  • 2015-05-15
相关资源
最近更新 更多