Как переставить повторяющиеся xml узлы, используя xslt - PullRequest
0 голосов
/ 07 февраля 2020

Пожалуйста, предложите код xslt для указанной ниже проблемы. Я предоставил простой код из ввода XML и ожидал XML. Мы будем благодарны, если кто-то может предоставить XSLT-код для преобразования ввода xml в ожидаемый xml.

INPUT 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>

EXPECTED 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>

Пожалуйста, помогите.

Спасибо в ожидании.

1 Ответ

0 голосов
/ 07 февраля 2020

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>
...