Переупорядочить узлы XML на основе условий в XSLT - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть входной XML, который я должен реструктурировать в другой XML с помощью XSLT.Входящий XML выглядит следующим образом:

 <Header>
    <Rejection>
        <Code>Code1</Code>
        <Text>Text1</Text>
    </Rejection>
    <Rejection>
        <Code>Code2</Code>
        <Text>Text2</Text>
    </Rejection>
    <Rejection>
        <Code>Code3</Code>
        <Text>Text3</Text>
    </Rejection>
</Header>

Всякий раз, когда отклонение имеет значение кода Code3, тег Code3 / Text3 должен быть первым тегом.Позиция Code3 может быть где угодно во входящем XML, но это должен быть первый тег отклонения в выходных данных.Это мой текущий XSLT

<xsl:for-each select="/Header/Rejection">
    <xsl:if test ="Code='Code3'">
        <REJECTION>
            <REJECTCODE><xsl:value-of select="Code"></xsl:value-of></REJECTCODE>
            <REJECTREASON><xsl:value-of select="Text"></xsl:value-of></REJECTREASON>
        </REJECTION>
    </xsl:if>
</xsl:for-each>
<xsl:for-each select="/Header/Rejection">
    <xsl:if test ="not(Code='Code3')">
        <REJECTION>
            <REJECTCODE><xsl:value-of select="Code"></xsl:value-of></REJECTCODE>
            <REJECTREASON><xsl:value-of select="Text"></xsl:value-of></REJECTREASON>
        </REJECTION>
    </xsl:if>
</xsl:for-each>

Теперь есть способ предотвратить 2 цикла и получить результат в одном цикле.Выходной XML должен выглядеть следующим образом:

<Header>
    <REJECTION>
        <REJECTCODE>Code3</REJECTCODE>
        <REJECTREASON>Text3</REJECTREASON>
    </REJECTION>
    <REJECTION>
        <REJECTCODE>Code1</REJECTCODE>
        <REJECTREASON>Text1</REJECTREASON>
    </REJECTION>
    <REJECTION>
        <REJECTCODE>Code2</REJECTCODE>
        <REJECTREASON>Text2</REJECTREASON>
    </REJECTION>
</Header>

Примечание: Коды являются просто образцом. На самом деле это буквенно-цифровой код и не в порядке сортировки.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018
<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Header">
        <xsl:copy>
            <xsl:apply-templates select="Rejection[3]"/>
            <xsl:apply-templates select="Rejection[1]"/>
            <xsl:apply-templates select="Rejection[2]"/>
        </xsl:copy>
    </xsl:template>
You may simply apply according to your need.
0 голосов
/ 19 ноября 2018

Как насчет:

<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:template match="/Header">
    <xsl:copy>
        <xsl:apply-templates select="Rejection">
            <xsl:sort select="number(Code='Code3')" data-type="number" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="Rejection">
   <REJECTION>
        <REJECTCODE>
            <xsl:value-of select="Code"/>
        </REJECTCODE>
        <REJECTREASON>
            <xsl:value-of select="Text"/>
        </REJECTREASON>
    </REJECTION>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...