XSLT 1.0:排序节点改变结构

时间:2012-03-30 14:22:57

标签: xslt sorting

我有以下简化的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>

我需要按<E1EDP01 SEGMENT="1">号码对<IDTNR>段进行排序,QUALF ='002'

所以我提出了这个XSLT:

<?xml version="1.0" encoding="UTF-8"?>

     

<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>段位于已排序的段之前,但应位于末尾。这是为什么?有人可以给我解释一下吗? 感谢您的帮助和问候, 彼得

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为您对所有内容进行了排序,而非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>