添加特定于另一个字段的输入值的字段的值

时间:2015-12-09 11:11:31

标签: xslt

我有一个使用xslt要求的要求。它只需要添加字段&NETWR'在E1EDP01下,当E1EDP01下的另一个字段WERKS满足一定条件时。此添加的总和将填充在E1EDS01下的不同节点字段SUMME下(E1EDS01的发生仅为一个)。 WERKS的条件是,它必须具有值= VK10 0r VK11 0r 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

1 个答案:

答案 0 :(得分:0)

您当前的sum函数位于xsl:for-each范围内,您可以在其中选择E1EDS01元素,因此表达式与此相关。换句话说,它正在寻找名为E1EDS01的{​​{1}}子元素。如果要在当前元素之外搜索,请在表达式ZM1之前再次从文档节点开始。此外,您的表达式当前正在汇总/这是一个属性,而在您的XML中它是一个元素。

试试这个表达。

@NEWTR

话虽如此,看看你当前的XSLT,在这种情况下根本不需要<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: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>