Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT1.0按子节点的值对xml节点进行分组_Xml_Xslt_Mapping_Xslt 1.0_Biztalk - Fatal编程技术网

XSLT1.0按子节点的值对xml节点进行分组

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

我正在使用XSLT1.0

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

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中指定名称空间,该样式表也不再有效。我发现有人有完全相同的问题:当然没有-看看这里为什么:。