2015-12-09 88 views
0

我有一個需要使用xslt來實現的要求。當E1EDP01下的另一個字段WERKS滿足一定條件時,它只需要在E1EDP01下添加字段'NETWR'的值。此添加的和將在E1EDS01下的不同節點字段SUMME下填充(E1EDS01的發生只有一個)。 WERKS的條件是,它必須具有值= VK10 0和VK11 0和VK12或(VK13和IDTNR不爲空)。我嘗試使用下面的XSLT代碼,但它給了我值'0'的輸出。任何人都可以請幫忙嗎? XSLT我使用:添加特定於其他字段的輸入值的字段的值

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <ZNUMBER> 
     <IDOC> 
      <xsl:for-each select="Z_MM/IDOC/E1EDS01"> 
       <E1EDS01> 
        <SUMME> 
        <xsl:value-of select="sum(Z_MM/IDOC/E1EDP01[(WERKS=&apos;VK13&apos; and E1EDP19/IDTNR!=&apos;&apos;) or WERKS = &apos;VK10&apos; or WERKS = &apos;VK11&apos; or WERKS = &apos;VK12&apos; ]/@NETWR)"/> 
        </SUMME> 
       </E1EDS01> 
      </xsl:for-each> 
     </IDOC> 
     </ZNUMBER> 
    </xsl:template> 
</xsl:stylesheet> 

INPUT XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Z_MM> 
    <IDOC BEGIN="1"> 
     <E1EDP01 SEGMENT="1"> 
     <NETWR>20</NETWR> 
     <WERKS>VK13</WERKS> 
     <E1EDP19 SEGMENT="1"> 
      <IDTNR>000000000000211087</IDTNR> 
     </E1EDP19> 
     </E1EDP01> 
     <E1EDP01 SEGMENT="1"> 
     <NETWR>10</NETWR> 
     <WERKS>VK11</WERKS> 
     <E1EDP19 SEGMENT="1"> 
      <QUALF>001</QUALF> 
     </E1EDP19> 
     </E1EDP01> 
     <E1EDS01 SEGMENT="1"> 
     <SUMID>002</SUMID> 
     <SUMME></SUMME> 
     <SUNIT></SUNIT> 
     </E1EDS01> 
    </IDOC> 
</Z_MM> 

OUTPUT應是20 + 10 = 30

回答

0

您當前sum功能是在其中選擇E1EDS01元素的xsl:for-each內,所以你的表達是相對的。換句話說,它正在尋找名爲ZM1E1EDS01的子元素。如果要在當前元素外部進行搜索,請在表達式/之前再次在文檔節點處開始。此外,您的表達式正在求和@NEWTR這是一個屬性,而在您的XML中它是一個元素。

試試這個表情。

<xsl:value-of select="sum(/Z_MM/IDOC/E1EDP01[(WERKS='VK13' and E1EDP19/IDTNR!='') or WERKS = 'VK10' or WERKS = 'VK11' or WERKS = 'VK12']/NETWR)"/> 

說了這麼多,看着你目前的XSLT,你並不真正需要的xsl:for-each在所有在這種情況下,你說只有一個E1EDS01和它,你實際上並沒有使用任何值無論如何。

試試這個XSLT(現在這裏不需要/,因爲你已經定位在文檔節點上了)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <ZNUMBER> 
     <IDOC> 
      <E1EDS01> 
       <SUMME> 
       <xsl:value-of select="sum(Z_MM/IDOC/E1EDP01[(WERKS='VK13' and E1EDP19/IDTNR!='') or WERKS = 'VK10' or WERKS = 'VK11' or WERKS = 'VK12']/NETWR)"/> 
       </SUMME> 
      </E1EDS01> 
     </IDOC> 
     </ZNUMBER> 
    </xsl:template> 
</xsl:stylesheet> 

另外,如果你XSLT是一個示例,你實際上只是要填充現有SUMME,你可以與身份模板做到這一點,和一個額外的模板來匹配SUMME

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

    <xsl:template match="SUMME"> 
     <xsl:copy> 
     <xsl:value-of select="sum(/Z_MM/IDOC/E1EDP01[(WERKS='VK13' and E1EDP19/IDTNR!='') or WERKS = 'VK10' or WERKS = 'VK11' or WERKS = 'VK12']/NETWR)"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

你好。感謝您的答覆。我已經嘗試了這兩種方法,但仍未收到正確的輸出結果。當使用第一種方法嘗試時 我得到輸出爲'0',並且當用模板appraoch嘗試時,輸出爲空。任何進一步的建議將不勝感激。 –

+0

我在http://xsltransform.net/gWvjQfs和http://xsltransform.net/jyRYYiu嘗試了我的解決方案,並根據需要將SUMME設置爲30。您的輸入XML是否準確?如果您在問題中使用不同的XML,例如,如果您的真實XML具有名稱空間,則可能存在問題。 –

+0

非常感謝。你提供的解決方案已經解決了這個問題,儘管我嘗試了類似的方式,但不幸的是找不到確切的錯誤,爲什麼它沒有提前工作。謝謝。 最好的問候 –

相關問題