2012-03-30 19 views
0

を変更します。XSLT 1.0:ソートノードIは、以下の単純化された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> 

私は= '002'

QUALFで自分<IDTNR>数で<E1EDP01 SEGMENT="1">セグメントをソートする必要があるので、私が思いつきました

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

:このXSLTと
<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>セグメントは、ソートされたセグメントの前に来るが、最後にする必要があります。何故ですか?誰かが私に説明を教えてもらえますか? ご協力ありがとうございます。 Peter

答えて

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> 
+0

それは私が前にそれを使ったことがない、興味深いアプローチである、パンダ-34ありがとうございます。ありがとう、私はあなたの解決策と一緒に行きます。敬具、Peter +1 – Peter

関連する問題