XSLT 排序存在少数子节点问题

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

我尝试使用 XSLT 仅对具有相同 /HEADER/DOC/E_E20/ROOT/MAT 段的特定段进行排序,如果存在这种情况,则必须使用 //ROOT/FIELD3 作为对整个段进行排序的键,其他段我们可以保持在它们所属的相同位置,我已经尝试过XSLT,它给出了准确的结果,但是E_E20下的初始段(ND2,ND3,L18是E_E20的子段)在输出中受到抑制,我尝试了所有可能的方法,请帮忙..

输入

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <DOC BEGIN="1">
        <EDI_40>
            <Field1>123</Field1>
        </EDI_40>
        <E_E20>
            <ND2>123</ND2>
            <ND3>345</ND3>
            <L18 SEGMENT="1">
                <QUALF>PGI</QUALF>
            </L18>
            <ROOT SEGMENT="1">
                <POS>000020</POS>
                <MAT>1234</MAT>
                <FIELD3>4199</FIELD3>
                <QUAN>3420</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000010</POS>
                <MAT>123456</MAT>
                <FIELD3>4199BI015</FIELD3>
                <QUAN>3420</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN1</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000010</POS>
                <MAT>123456</MAT>
                <FIELD3>4184AI015</FIELD3>
                <QUAN>1026</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN2</PQ>
                </CHILD>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN2</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000010</POS>
                <MAT>123456</MAT>
                <FIELD3>4200AI015</FIELD3>
                <QUAN>1197</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN3</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000030</POS>
                <MAT>123</MAT>
                <FIELD3>4200AI</FIELD3>
                <QUAN>1197</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN</PQ>
                </CHILD>
            </ROOT>
        </E_E20>
    </DOC>
</HEADER>


**输出**

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <DOC BEGIN="1">
        <EDI_40>
            <Field1>123</Field1>
        </EDI_40>
        <E_E20>
            <ND2>123</ND2>
            <ND3>345</ND3>
            <L18 SEGMENT="1">
                <QUALF>PGI</QUALF>
            </L18>
            <ROOT SEGMENT="1">
                <POS>000020</POS>
                <MAT>1234</MAT>
                <FIELD3>4199</FIELD3>
                <QUAN>3420</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000010</POS>
                <MAT>123456</MAT>
                <FIELD3>4184AI015</FIELD3>
                <QUAN>1026</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN2</PQ>
                </CHILD>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN2</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000010</POS>
                <MAT>123456</MAT>
                <FIELD3>4199BI015</FIELD3>
                <QUAN>3420</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN1</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000010</POS>
                <MAT>123456</MAT>
                <FIELD3>4200AI015</FIELD3>
                <QUAN>1197</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN3</PQ>
                </CHILD>
            </ROOT>
            <ROOT SEGMENT="1">
                <POS>000030</POS>
                <MAT>123</MAT>
                <FIELD3>4200AI</FIELD3>
                <QUAN>1197</QUAN>
                <CHILD SEGMENT="1">
                    <POS>000010</POS>
                    <PQ>UN</PQ>
                </CHILD>
            </ROOT>
        </E_E20>
    </DOC>
</HEADER>


我用过XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:output method="xml" indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="E_E20">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each-group select="ROOT" group-by="MAT">
        <xsl:apply-templates select="current-group()">
          <xsl:sort select="FIELD3"/>
        </xsl:apply-templates>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>



</xsl:stylesheet>

xslt-2.0 xslt-3.0
1个回答
0
投票

<xsl:apply-templates select="@*"/>
更改为
<xsl:apply-templates select="@*, * except ROOT"/>

© www.soinside.com 2019 - 2024. All rights reserved.