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
对一些XML节点进行排序_Xml_Xslt_Mapping_Xslt 1.0_Biztalk - Fatal编程技术网

对一些XML节点进行排序

对一些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 Article102 A B Order1 Article101 A B A B A B etc 我的目标是将A和B节点放在消息的开头,因此我有: A B A B A B A B A B Order0 Article100 Article102 Order1 Article101 下面是一个例子: 输入 <M

我正在使用XSLT1.0

我有一个输入消息,我正在尝试转换。该输入消息由4种类型的节点A、B、Order和Article组成。像这个:

A
B
Order0
Article100
Article102
A
B
Order1
Article101
A
B
A
B
A
B
etc
我的目标是将A和B节点放在消息的开头,因此我有:

A
B
A
B
A
B
A
B
A
B
Order0
Article100
Article102
Order1
Article101
下面是一个例子:

输入

<Messages>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
</Messages>
<Messages>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
</Messages>

一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
输出

<Messages>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
</Messages>
<Messages>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <A>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </A>
    </Message>
    <Message>
        <B>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </B>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
    <Message>
        <Order>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Order>
    </Message>
    <Message>
        <Article>
            <SomeData>somedata</SomeData>
            <SomeData2>somedata</SomeData2>
        </Article>
    </Message>
</Messages>

一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
一些数据
不幸的是,我在使用旧版本的Biztalk时受到XSLT1.0的限制。
我考虑过可能使用order by,但只针对那些A和B节点。

如果您确实只有这些元素需要排序,您可以直接命名它们,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>
  
  <!-- Identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Messages">
      <xsl:copy>
        <xsl:apply-templates select="Message[A or B]"/>
        <xsl:apply-templates select="Message[not(A) and not(B)]"/>
      </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>


查看此处的工作情况:

如果要通过排序完成此操作,可以执行以下操作:

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:template match="/Messages">
    <xsl:copy>
        <xsl:for-each select="Message">
            <xsl:sort select="number(A or B)" data-type="number" order="descending"/>
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>


更正了我的答案。工作正常