2012-07-04 139 views
2

我需要将SAP IDOC xml转换为AdsML格式。 但是抽象的问题是:如何将xml1转换为xml2?XSLT 1.0:IDOC到AdsML转换

XML1:

<E1BPBUSISM008_ITEM_OUT> 
    <ITEM_NUMBER>010</ITEM_NUMBER> 
</E1BPBUSISM008_ITEM_OUT> 
<E1BPBUSISM008_ITEM_OUT> 
    <ITEM_NUMBER>020</ITEM_NUMBER> 
</E1BPBUSISM008_ITEM_OUT> 

<E1BPBUSISM008_AD_SPEC_AD_OU> 
    <ITEM_NUMBER>010</ITEM_NUMBER> 
    <PLANNED_WIDTH>1.851</PLANNED_WIDTH> 
    <PLANNED_HEIGHT>0.000</PLANNED_HEIGHT> 
</E1BPBUSISM008_AD_SPEC_AD_OU> 
<E1BPBUSISM008_AD_SPEC_AD_OU> 
    <ITEM_NUMBER>020</ITEM_NUMBER> 
    <PLANNED_WIDTH>2.37</PLANNED_WIDTH> 
    <PLANNED_HEIGHT>0.000</PLANNED_HEIGHT> 
</E1BPBUSISM008_AD_SPEC_AD_OU> 

到XML2:

<Ad> 
    <ad-number>010<ad-number> 
    <width>1.851</width> 
    <height>0.000</height> 
</Ad> 
<Ad> 
    <ad-number>020<ad-number> 
    <width>2.37</width> 
    <height>0.000</height> 
</Ad> 

我在这里试过是Muench法,但即使是这种情况下正确的解决方案,不知道如何去完成它,因为它会返回错误的“宽度”和“高度”(对于所有广告元素都是相同的):

<xsl:key name="adnumbers" match="IE1BPBUSISM008_ITEM_OUT" use="ITEM_NUMBER"/> 
.... 
<xsl:for-each select="E1BPBUSISM008_ITEM_OUT[generate-id(.)=generate-id(key('adnumbers',ITEM_NUMBER)[1])]"> 
<xsl:sort select="ITEM_NUMBER"/> 
<Ad> 
<ad-number> 
    <xsl:value-of select="ITEM_NUMBER/text()"/> 
</ad-number> 
<width> 
<xsl:value-of select="E1BPBUSISM008_AD_SPEC_AD_OU/PLANNED_WIDTH"/> 
</width> 
<height> 
<xsl:value-of select="E1BPBUSISM008_AD_SPEC_AD_OU/PLANNED_HEIGHT"/> 
</height> 

输出:

<Ad> 
    <number>010</ad-number> 
    <width>1.851</width> 
    <heigth>0.000</heigth> 
</Ad> 
<Ad> 
    <number>020</ad-number> 
    <width>1.851</width> 
    <heigth>0.000</heigth> 
</Ad> 

回答

3

您将不需要真正的Muenchian分组 - 使用密钥就足以获得理想的结果。

<xsl:key name="k_AD_SPEC_AD_OU" match="E1BPBUSISM008_AD_SPEC_AD_OU" use="ITEM_NUMBER" /> 

<!-- ... --> 

<xsl:for-each select="E1BPBUSISM008_ITEM_OUT"> 
    <xsl:sort select="ITEM_NUMBER" /> 
    <Ad> 
     <ad-number> 
      <xsl:value-of select="ITEM_NUMBER" /> 
     </ad-number> 
     <width> 
      <xsl:value-of select="key('k_AD_SPEC_AD_OU', ITEM_NUMBER)[1]/PLANNED_WIDTH" /> 
     </width> 
     <height> 
      <xsl:value-of select="key('k_AD_SPEC_AD_OU', ITEM_NUMBER)[1]/PLANNED_HEIGHT" /> 
     </height> 
    </Ad> 
</xsl:for-each> 

<!-- ... --> 

但是正确的解决方案取决于您的E1BPBUSISM008_ITEM_OUTE1BPBUSISM008_AD_SPEC_AD_OU之间的关系:你举的例子表明,这只是1至1这将使键不必要的,但我怀疑你的实际关系可能是相当1至0或1或甚至1至0或更多

如果您需要为缺失的E1BPBUSISM008_AD_SPEC_AD_OU元素(1到0或1关系)创建输出,xslt将需要一些调整。


对于简单1至1关系的XSLT看起来是这样的:

<!-- ... --> 

<xsl:for-each select="E1BPBUSISM008_ITEM_OUT"> 
    <xsl:sort select="ITEM_NUMBER" /> 
    <Ad> 
     <ad-number> 
      <xsl:value-of select="ITEM_NUMBER" /> 
     </ad-number> 

     <xsl:call-template name="AD_SPEC_AD_OU"> 
      <xsl:with-param name="pITEM_NUMBER" select="ITEM_NUMBER" /> 
     </xsl:call-template> 
    </Ad> 
</xsl:for-each> 

<xsl:template name="AD_SPEC_AD_OU"> 
    <xsl:param name="pITEM_NUMBER" /> 

    <width> 
     <xsl:value-of select="//E1BPBUSISM008_AD_SPEC_AD_OU[ITEM_NUMBER = $pITEM_NUMBER]/PLANNED_WIDTH" /> 
    </width> 
    <height> 
     <xsl:value-of select="//E1BPBUSISM008_AD_SPEC_AD_OU[ITEM_NUMBER = $pITEM_NUMBER]/PLANNED_HEIGHT" /> 
    </height> 
</xsl:template>