我有以下简化的XML结构:
<?xml version="1.0" encoding="UTF-8" ?>
<INVOIC02>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718221</IDTNR>
<KTEXT>Orange</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>Z03</QUALF>
<IDTNR>7610400013079</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718160</IDTNR>
<KTEXT>Pistache</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400181600</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718228</IDTNR>
<KTEXT>Strawberry</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400182287</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718221</IDTNR>
<KTEXT>Orange</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400182218</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718160</IDTNR>
<KTEXT>Pistache</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400181600</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718228</IDTNR>
<KTEXT>Strawberry</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400182287</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDS01 SEGMENT="1">
<SUMID>001</SUMID>
<SUMME>6</SUMME>
</E1EDS01>
</IDOC>
</INVOIC02>我需要使用QUALF='002‘根据<IDTNR>号对<E1EDP01 SEGMENT="1">段进行排序
所以我想出了这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>http://www.w3.org/1999/XSL/Transform“xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl”version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="IDOC">
<xsl:apply-templates>
<xsl:sort select="E1EDP19[QUALF='002']/IDTNR"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>但在我的输出中,<E1EDP01>片段是排序的,但被放在我的结构的末尾:
<?xml version="1.0" encoding="UTF-8"?>
<INVOIC02>
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDS01 SEGMENT="1">
<SUMID>001</SUMID>
<SUMME>6</SUMME>
</E1EDS01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718160</IDTNR>
<KTEXT>Pistache</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400181600</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718160</IDTNR>
<KTEXT>Pistache</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400181600</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718221</IDTNR>
<KTEXT>Orange</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>Z03</QUALF>
<IDTNR>7610400013079</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718221</IDTNR>
<KTEXT>Orange</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400182218</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718228</IDTNR>
<KTEXT>Strawberry</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400182287</IDTNR>
</E1EDP19>
</E1EDP01>
<E1EDP01 SEGMENT="1">
<MENGE>1.000</MENGE>
<E1EDP19 SEGMENT="1">
<QUALF>002</QUALF>
<IDTNR>000000000000718228</IDTNR>
<KTEXT>Strawberry</KTEXT>
</E1EDP19>
<E1EDP19 SEGMENT="1">
<QUALF>003</QUALF>
<IDTNR>7610400182287</IDTNR>
</E1EDP19>
</E1EDP01>
</INVOIC02><E1EDS01>数据段在排序数据段之前,但应该在末尾。为什么会这样呢?
发布于 2012-03-30 23:02:48
这是因为您对所有内容进行了排序,而非E1EDP01元素将具有空的排序键。相反,你可以强制他们的立场,比如:
<xsl:template match="IDOC">
<xsl:apply-templates select="EDI_DC40"/>
<xsl:apply-templates select="E1EDP01">
<xsl:sort select="E1EDP19[QUALF='002']/IDTNR"/>
</xsl:apply-templates>
<xsl:apply-templates select="E1EDS01"/>
</xsl:template>https://stackoverflow.com/questions/9944822
复制相似问题