XSLT排序嵌套XML



我需要基于e1edp01 -posex和操作对以下XML进行以下XML,应像以前一样复制XML的其余部分。请注意,在E1EDP01下有E1EDP19,它也应该被复制。我的XSLT不起作用bcoz am不确定模板匹配的值应该是什么。请帮助。

<ORDERS05>
 <IDOC BEGIN="1">
 <E1EDK14 SEGMENT="1">
        <QUALF>014</QUALF>
        <ORGID>PF01</ORGID>
    </E1EDK14>

 <E1EDP01 SEGMENT="1">
        <POSEX>00020</POSEX>
        <ACTION>001</ACTION>
        <PSTYP>0</PSTYP>
        <MENGE>540.000</MENGE>
        <MENEE>RO</MENEE>
       <E1EDP19>
          <Text> Test 2 </Text>
        </E1EDP19>
 </E1EDP01>
 <E1EDP01 SEGMENT="1">
        <POSEX>00030</POSEX>
        <ACTION>001</ACTION>
        <PSTYP>1</PSTYP>
        <MENGE>140.000</MENGE>
        <MENEE>AD</MENEE>
        <E1EDP19>
          <Text> Test 1 </Text>
        </E1EDP19>
 </E1EDP01>
 <E1EDS01 SEGMENT="1">
        <SUMID>002</SUMID>
        <SUMME>832.2</SUMME>
        <SUNIT>USD</SUNIT>
    </E1EDS01>
</IDOC>
</ORDERS05>

 <xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <!--                                                --> 
  <xsl:strip-space elements="*"/>
  <!--                                                --> 
    <xsl:template match="node()|@*">
     <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
   </xsl:template>
   <!--                                                --> 
 <xsl:template match="E1EDP01">
<xsl:copy>
  <xsl:apply-templates select="@*"/>
  <xsl:apply-templates select="POSEX">
    <xsl:sort select="POSEX" order="descending" data-type="number"/>
     </xsl:apply-templates>
   </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

  Expected Result
  <ORDERS05>
  <IDOC BEGIN="1">
  <E1EDK14 SEGMENT="1">
    <QUALF>014</QUALF>
    <ORGID>PF01</ORGID>
    </E1EDK14>
    <E1EDP01 SEGMENT="1">
      <POSEX>00030</POSEX>
      <ACTION>001</ACTION>
     <PSTYP>1</PSTYP>
    <MENGE>140.000</MENGE>
    <MENEE>AD</MENEE>
    <E1EDP19>
      <Text> Test 1 </Text>
    </E1EDP19>
 </E1EDP01>

  <E1EDP01 SEGMENT="1">
    <POSEX>00020</POSEX>
    <ACTION>001</ACTION>
    <PSTYP>0</PSTYP>
    <MENGE>540.000</MENGE>
    <MENEE>RO</MENEE>
   <E1EDP19>
      <Text> Test 2 </Text>
    </E1EDP19>
  </E1EDP01>

  <E1EDS01 SEGMENT="1">
    <SUMID>002</SUMID>
    <SUMME>832.2</SUMME>
    <SUNIT>USD</SUNIT>
  </E1EDS01>
 </IDOC>
 </ORDERS05>

如果要对E1EDP01元素进行排序,则在模板处理父母的孩子的xsl:apply-templates中使用xsl:sort

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[E1EDP01]">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:for-each-group select="node()" group-adjacent="boolean(self::E1EDP01)">
                <xsl:choose>
                    <xsl:when test="current-grouping-key()">
                         <xsl:apply-templates select="current-group()">
                            <xsl:sort select="POSEX" order="descending"/>
                            <xsl:sort select="ACTION" order="descending"/>
                        </xsl:apply-templates>                        
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>        
        </xsl:copy>
    </xsl:template>
</xsl:transform>

http://xsltransform.net/ncntct9/1有一个在线示例。

最新更新