我需要根据E1EDP01 - POSEX和ACTION从SAP中对以下XML进行排序,其余的xml应该按原样复制。请注意E1EDP01下的E1EDP19,也应该按照原样复制。我的XSLT不工作bcoz我不确定模板匹配的值应该是什么。请帮忙。
<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>
答案 0 :(得分:0)
如果要对E1EDP01
元素进行排序,请在模板的xsl:sort
中使用xsl:apply-templates
处理父元素的子元素:
<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>