我有一个使用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='VK13' and E1EDP19/IDTNR!='') or WERKS = 'VK10' or WERKS = 'VK11' or WERKS = 'VK12' ]/@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 :(得分: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>