2013-01-23 113 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