如何使用 xslt 重新排列重复的 xml 节点

How to re-arrange repeated xml nodes using xslt

请建议以下问题的 xslt 代码。我已经从输入 XML 和预期的 XML 中提供了一个简单的代码。如果有人可以提供 XSLT 代码以将输入 xml 转换为预期的 xml.

,我们将不胜感激。

输入XML

    <INFOPERSONFILLNOTE>
    <VARIABLELABEL>Level</VARIABLELABEL>
    <SERIALNO1 STATUS="NONE">
    1
    <VARIABLELABEL>S1</VARIABLELABEL>
    <CHANGEDATE/>
    <CHANGEREASON/>
    </SERIALNO1>
    <SERIALNO1 STATUS="NONE">
    2
    <VARIABLELABEL>S2</VARIABLELABEL>
    <CHANGEDATE/>
    <CHANGEREASON/>
    </SERIALNO1>
    <CLASSPERSONFILLNOTE STATUS="NONE">
    c1
    <VARIABLELABEL>C1</VARIABLELABEL>
    <CHANGEDATE>20200226</CHANGEDATE>
    <CHANGEREASON>cr</CHANGEREASON>
    </CLASSPERSONFILLNOTE>
    <CLASSPERSONFILLNOTE STATUS="NONE">
    c2
    <VARIABLELABEL>C2</VARIABLELABEL>
    <CHANGEDATE>20200226</CHANGEDATE>
    <CHANGEREASON>cr</CHANGEREASON>
    </CLASSPERSONFILLNOTE>
   </<INFOPERSONFILLNOTE>

预计XML:

    <INFOPERSONFILLNOTE>
    <VARIABLELABEL>Level</VARIABLELABEL>
    <SERIALNO1 STATUS="NONE">
    1
    <VARIABLELABEL>S1</VARIABLELABEL>
    <CHANGEDATE/>
    <CHANGEREASON/>
    </SERIALNO1>
    <CLASSPERSONFILLNOTE STATUS="NONE">
    c1
    <VARIABLELABEL>C1</VARIABLELABEL>
    <CHANGEDATE>20200226</CHANGEDATE>
    <CHANGEREASON>cr</CHANGEREASON>
    </CLASSPERSONFILLNOTE>
    <SERIALNO1 STATUS="NONE">
    2
    <VARIABLELABEL>S2</VARIABLELABEL>
    <CHANGEDATE/>
    <CHANGEREASON/>
    </SERIALNO1>
    <CLASSPERSONFILLNOTE STATUS="NONE">
    c2
    <VARIABLELABEL>C2</VARIABLELABEL>
    <CHANGEDATE>20200226</CHANGEDATE>
    <CHANGEREASON>cr</CHANGEREASON>
    </CLASSPERSONFILLNOTE>
   </<INFOPERSONFILLNOTE>

请帮忙。

感谢期待。

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

<xsl:template match="INFOPERSONFILLNOTE">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="VARIABLELABEL"/>

        <xsl:for-each select="SERIALNO1|CLASSPERSONFILLNOTE">
            <xsl:sort select="number(translate(VARIABLELABEL, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', ''))" order="ascending"/>
            <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

结果:

<INFOPERSONFILLNOTE>
<VARIABLELABEL>Level</VARIABLELABEL>
<SERIALNO1 STATUS="NONE">
1
<VARIABLELABEL>S1</VARIABLELABEL>
<CHANGEDATE/>
<CHANGEREASON/>
</SERIALNO1><CLASSPERSONFILLNOTE STATUS="NONE">
c1
<VARIABLELABEL>C1</VARIABLELABEL>
<CHANGEDATE>20200226</CHANGEDATE>
<CHANGEREASON>cr</CHANGEREASON>
</CLASSPERSONFILLNOTE><SERIALNO1 STATUS="NONE">
2
<VARIABLELABEL>S2</VARIABLELABEL>
<CHANGEDATE/>
<CHANGEREASON/>
</SERIALNO1><CLASSPERSONFILLNOTE STATUS="NONE">
c2
<VARIABLELABEL>C2</VARIABLELABEL>
<CHANGEDATE>20200226</CHANGEDATE>
<CHANGEREASON>cr</CHANGEREASON>
</CLASSPERSONFILLNOTE>
</INFOPERSONFILLNOTE>