XSLT 映射根据字段值对段进行排序

问题描述 投票:0回答:1

我正在尝试编写XSLT1.0来根据字段对子段进行排序,我无法对其进行排序,有人可以帮忙吗? 附加输入和输出文件请建议

会有多个段,我们需要根据字段排序,而不删除像,

这样的子段

输入样本

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <CODI BEGIN="1">
        <DC40 SEGMENT="1">
            <TABNAM>DC40</TABNAM>
        </DC40>
        <BODY SEGMENT="1">
            <BLDAT>20240503</BLDAT>
            <CHILD SEGMENT="1">
                <RNTAM>68850363</RNTAM>
                <KEY>900030</KEY>
                <ITEM SEGMENT="1">
                    <NAE11>0000000000000</NAE11>
                </ITEM>
            </CHILD>
            <CHILD SEGMENT="1">
                <RNTAM>68850363</RNTAM>
                <KEY>900020</KEY>
                <ITEM SEGMENT="1">
                    <NAE11>0000000001000</NAE11>
                </ITEM>
            </CHILD>
            <CHILD SEGMENT="1">
                <RNTAM>68850792</RNTAM>
                <KEY>900010</KEY>
                <ITEM SEGMENT="1">
                    <NAE11>0000010000000</NAE11>
                </ITEM>
                <ITEM SEGMENT="1">
                    <NAE11>0000000030000</NAE11>
                </ITEM>     
            </CHILD>        
        </BODY>
    </CODI>
</HEADER>

输出样本

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <CODI BEGIN="1">
        <DC40 SEGMENT="1">
            <TABNAM>DC40</TABNAM>
        </DC40>
        <BODY SEGMENT="1">
            <BLDAT>20240503</BLDAT>         
            <CHILD SEGMENT="1">
                <RNTAM>68850792</RNTAM>
                <KEY>900010</KEY>
                <ITEM SEGMENT="1">
                    <NAE11>0000010000000</NAE11>
                </ITEM>
                <ITEM SEGMENT="1">
                    <NAE11>0000000030000</NAE11>
                </ITEM>             
            </CHILD>            
            <CHILD SEGMENT="1">
                <RNTAM>68850363</RNTAM>
                <KEY>900020</KEY>
                <ITEM SEGMENT="1">
                    <NAE11>0000000001000</NAE11>
                </ITEM>
            </CHILD>            
            <CHILD SEGMENT="1">
                <RNTAM>68850363</RNTAM>
                <KEY>900030</KEY>
                <ITEM SEGMENT="1">
                    <NAE11>0000000000000</NAE11>
                </ITEM>
            </CHILD>            
        </BODY>
    </CODI>
</HEADER>

我尝试了下面的代码,请您帮忙。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <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="HEADER/CODI/BODY/CHILD"/>
            <xsl:sort select="CHILD()"/>
            <xsl:copy-of select="."/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
xslt xslt-1.0
1个回答
0
投票

我想你想要:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="BODY">
    <xsl:copy>
        <xsl:apply-templates select="@* | BLDAT"/>
        <xsl:apply-templates select="CHILD">
            <xsl:sort select="KEY"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.