代码之家  ›  专栏  ›  技术社区  ›  Mike Dole

xsl 1.0每个复合键的muenchian求和到求和数量字段

  •  0
  • Mike Dole  · 技术社区  · 7 年前

    对于SAP PO xsl 1.0映射,我需要映射一个来自我们仓库的“外来”文件,其中我需要在行标识符(主订单行号)和项目编号(SKU)的组合上对每订单数量字段进行分组/求和(RECH)。每一行(REC)都在一个标题(RECH)中。

    输入:

        <?xml version="1.0" encoding="UTF-8"?>
    <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
       <ns0:Message1>
    <MARCXML>
      <RCIC>
        <RECH>
          <SALESID>24000</SALESID>
          <RECL>
            <LINE_NO>1</LINE_NO>
            <QTY_EXPE>1592</QTY_EXPE>
            <SKU>11207-210</SKU>
            <MASTER_PO_LINE_NO>10</MASTER_PO_LINE_NO>
          </RECL>
          <RECL>
            <LINE_NO>2</LINE_NO>
            <QTY_EXPE>1000</QTY_EXPE>
            <SKU>11207-210</SKU>
            <MASTER_PO_LINE_NO>10</MASTER_PO_LINE_NO>
          </RECL>
          <RECL>
            <LINE_NO>3</LINE_NO>
            <QTY_EXPE>175</QTY_EXPE>
            <SKU>11207-210</SKU>
            <MASTER_PO_LINE_NO>20</MASTER_PO_LINE_NO>
          </RECL>
        </RECH>
        <RECH>
          <SALESID>25001</SALESID>
          <RECL>
            <LINE_NO>1</LINE_NO>
            <QTY_EXPE>440</QTY_EXPE>
            <SKU>20000-210</SKU>
            <MASTER_PO_LINE_NO>10</MASTER_PO_LINE_NO>
          </RECL>
        </RECH>
      </RCIC>
    </MARCXML>
     </ns0:Message1>
    </ns0:Messages>
    

    <?xml version="1.0" encoding="UTF-8"?>
    <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
       <ns0:Message1>
    <MARCXML>
      <RCIC>
        <RECH>
          <SALESID>24000</SALESID>
          <RECL>
            <LINE_NO>1</LINE_NO>
            <QTY_EXPE>2592</QTY_EXPE>
            <SKU>11207-210</SKU>
            <MASTER_PO_LINE_NO>10</MASTER_PO_LINE_NO>
          </RECL>
          <RECL>
            <LINE_NO>3</LINE_NO>
            <QTY_EXPE>175</QTY_EXPE>
            <SKU>11207-210</SKU>
            <MASTER_PO_LINE_NO>20</MASTER_PO_LINE_NO>
          </RECL>
        </RECH>
        <RECH>
          <SALESID>25001</SALESID>
          <RECL>
            <LINE_NO>1</LINE_NO>
            <QTY_EXPE>440</QTY_EXPE>
            <SKU>20000-210</SKU>
            <MASTER_PO_LINE_NO>10</MASTER_PO_LINE_NO>
          </RECL>
        </RECH>
      </RCIC>
    </MARCXML>
     </ns0:Message1>
    </ns0:Messages>
    

    有很多关于门钦族分组的例子,但我还没有设法解决我的需求。老实说,我已经做到了:

    <?xml version="1.0" encoding="UTF-8"?>
    <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
       <ns0:Message1>
          <MARCXML>
             <RCIC>
                <RECH>5284</RECH>
                <RECH>5284</RECH>
                <RECH>5284</RECH>
             </RCIC>
          </MARCXML>
       </ns0:Message1>
    </ns0:Messages>
    

    使用以下xsl:

    <?xml version="1.0" encoding="UTF-8"?>
    
    
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
    
    
        <xsl:key name="kMSTR_PO_LN_SKU" match="RECL"
         use="concat(MASTER_PO_LINE_NO, '#', SKU)"/>
    
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="RECH">
            <xsl:copy>
                <xsl:value-of select="sum(//MARCXML/RCIC/RECH/RECL/QTY_CHECKED_IN)" />
    
                <xsl:for-each select="/RECL[generate-id()=generate-id(key('kMSTR_PO_LN_SKU',concat(MASTER_PO_LINE_NO,'-',SKU))[1])]">
                    <xsl:copy>
                        <SKU>
                            <xsl:value-of select="SKU"/>
                        </SKU>
                        <Quantity>
                            <xsl:value-of select="sum(key('kMSTR_PO_LN_SKU',concat(MASTER_PO_LINE_NO,'-',RECL))/QTY_EXPE)"/>
                        </Quantity>
                    </xsl:copy>
                </xsl:for-each>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>
    

    希望有人能在我来这里的路上帮我

    1 回复  |  直到 7 年前
        1
  •  1
  •   michael.hor257k    7 年前

    在AFAICT中,这会产生所需的输出-但是只有一个示例具有一些模糊的规则,这可能是巧合。无论如何,它应该为您提供一个起点。

    XSLT1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:key name="k1" match="RECL" use="concat(MASTER_PO_LINE_NO, '|', SKU)"/>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="RECH">
        <xsl:copy>
            <xsl:copy-of select="SALESID"/>
            <xsl:for-each select="RECL[generate-id()=generate-id(key('k1', concat(MASTER_PO_LINE_NO,'|',SKU))[1])]">
                <xsl:copy>
                    <xsl:copy-of select="LINE_NO"/>
                    <QTY_EXPE>
                        <xsl:value-of select="sum(key('k1', concat(MASTER_PO_LINE_NO,'|',SKU))/QTY_EXPE)" />
                    </QTY_EXPE>
                    <xsl:copy-of select="SKU | MASTER_PO_LINE_NO"/>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    补充:

    RECH )另外,您必须将订单的标识符添加到密钥:

    XSLT1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:key name="k1" match="RECL" use="concat(MASTER_PO_LINE_NO, '|', SKU, '|', generate-id(..))"/>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="RECH">
        <xsl:copy>
            <xsl:copy-of select="SALESID"/>
            <xsl:for-each select="RECL[generate-id()=generate-id(key('k1', concat(MASTER_PO_LINE_NO,'|',SKU, '|', generate-id(..)))[1])]">
                <xsl:copy>
                    <xsl:copy-of select="LINE_NO"/>
                    <QTY_EXPE>
                        <xsl:value-of select="sum(key('k1', concat(MASTER_PO_LINE_NO,'|',SKU, '|', generate-id(..)))/QTY_EXPE)" />
                    </QTY_EXPE>
                    <xsl:copy-of select="SKU | MASTER_PO_LINE_NO"/>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>