2013-01-23 144 views
0

我有以下簡單的XML結構:XSLT 1.0:Muenchian分組的不工作

<?xml version="1.0" encoding="utf-8"?> 
<list> 
<INVOIC> 
    <M_INVOIC> 
     <G_SG25> 
      <S_LIN> 
       <id>LIN</id> 
       <D_1082>1</D_1082> 
       <C_C212> 
        <D_7140>7610400271943</D_7140> 
        <D_7143_3>EN</D_7143_3> 
       </C_C212> 
      </S_LIN> 
     </G_SG25> 
     <G_SG25> 
      <S_LIN> 
       <id>LIN</id> 
       <D_1082>2</D_1082> 
       <C_C212> 
        <D_7140>1234567890123</D_7140> 
        <D_7143_3>EN</D_7143_3> 
       </C_C212> 
      </S_LIN> 
     </G_SG25> 
    </M_INVOIC> 
</INVOIC> 
<INVOIC> 
    <SALESORDER> 
     <ET_VBAP> 
      <item> 
       <VBELN>0010002695</VBELN> 
       <POSNR>000010</POSNR> 
       <MATNR>000000000000400487</MATNR> 
       <EAN11>1234567890123</EAN11> 
      </item> 
      <item> 
       <VBELN>0010002695</VBELN> 
       <POSNR>000020</POSNR> 
       <MATNR>000000000000002054</MATNR> 
       <EAN11>5012454920549</EAN11> 
      </item> 
      <item> 
       <VBELN>0010002695</VBELN> 
       <POSNR>000030</POSNR> 
       <MATNR>000000000000392104</MATNR> 
       <EAN11>3046920921046</EAN11> 
      </item> 
      <item> 
       <VBELN>0010002695</VBELN> 
       <POSNR>000040</POSNR> 
       <MATNR>000000000000859146</MATNR> 
       <EAN11>8003340591469</EAN11> 
      </item> 
      <item> 
       <VBELN>0010002695</VBELN> 
       <POSNR>000050</POSNR> 
       <MATNR>000000000000727194</MATNR> 
       <EAN11>7610400271943</EAN11> 
      </item> 
     </ET_VBAP> 
    </SALESORDER> 
</INVOIC> 
</list> 

我的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 
<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

<xsl:key name="kByEanPos" match="G_SG25" use="S_LIN/C_C212/D_7140"/> 

<xsl:template match="/"> 

    <xsl:variable name="uniqueSet" select="G_SG25[generate-id()=generate-id(key('kByEanPos',S_LIN/C_C212/D_7140))]"/> 
    <list> 
     <xsl:for-each select="list/INVOIC/M_INVOIC/G_SG25[generate-id()= 
      generate-id(key('kByEanPos',S_LIN/C_C212/D_7140))]"> 
      <ean> 
       <xsl:value-of select="parent::M_INVOIC/parent::INVOIC/parent::list/INVOIC/SALESORDER/ET_VBAP/item/MATNR"/> 
      </ean> 
     </xsl:for-each> 
    </list> 
</xsl:template> 
</xsl:stylesheet> 

給我這個XML輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
<ean>000000000000400487</ean> 
<ean>000000000000400487</ean> 
</list> 

但我期望的XML輸出是:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
<ean>000000000000727194</ean> 
<ean>000000000000400487</ean> 
</list> 

我不確定我做錯了什麼,我找不到我的錯誤。我認爲這與我所定義的關鍵有關。 基本上我需要一個<D_7140>上的密鑰,然後在EAN11下面的結構中查找該數字,然後輸出MATNR

謝謝你的任何想法和問候, 彼得

回答

0

如果你想根據自己的EAN11值查找項目元素,它可能是值得使用考慮關鍵要做到這一點太

<xsl:key name="item" match="item" use="EAN11" /> 

這樣一來,可以減少你的xsl:value-of的只是這個

<xsl:value-of select="key('item', S_LIN/C_C212/D_7140)/MATNR"/> 
+0

你好Tim,謝謝。您的解決方案完美運作我使用密鑰匹配項目並使用EAN11調整了我的映射。最好的問候,彼得 – Peter

1

在這一行:

<xsl:value-of 
    select="parent::M_INVOIC/parent::INVOIC/parent::list/INVOIC/SALESORDER/ET_VBAP/item/MATNR"/> 

你攀登一路節點樹,並回落到MATNR,所以只能這個永遠會找到的東西是文檔中的第一個MATNR。要找到對應於當前D_7140for-eachMATNR,這應該工作:

<xsl:value-of 
    select="/list/INVOIC/SALESORDER/ET_VBAP/item[EAN11 = current()/S_LIN/C_C212/D_7140]/MATNR"/> 
+0

你好JLRishe,謝謝你的回答 - 它有效(+1)。我更喜歡Tim C的解決方案,因爲它避免了長時間的XPATH。最好的問候,彼得 – Peter