C# 我想计算两个元素在不同层次上的乘积之和
我尝试了以下代码,但它不工作。我使用了一个字符串,在其中编写XSLT并加载XslCompiledTransform对象C# 我想计算两个元素在不同层次上的乘积之和,c#,xml,xslt,xpath,xslt-1.0,C#,Xml,Xslt,Xpath,Xslt 1.0,我尝试了以下代码,但它不工作。我使用了一个字符串,在其中编写XSLT并加载XslCompiledTransform对象 <xsl:sequence select= "sum(//Item/(cost * related_id/Item/quantity))"/> 源XML: <AML> <Item> <cost> 40 </cost> <related_id>
<xsl:sequence select=
"sum(//Item/(cost * related_id/Item/quantity))"/>
源XML:
<AML>
<Item>
<cost>
40
</cost>
<related_id>
<Item>
<quantity>2</quantity>
</Item>
</related_id>
</Item>
<Item>
<cost>
50
</cost>
<related_id>
<Item>
<quantity>10</quantity>
</Item>
</related_id>
</Item>
</AML>
40
2.
50
10
正如我在评论中所说的,xsl:sequence
和您尝试使用的XPath语法在XSLT 1.0(XslCompiledTransform使用)中不可用,但您可以通过使用递归模板实现公式的总和:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:call-template name="SumSet">
<xsl:with-param name="items" select="/*/Item" />
</xsl:call-template>
</xsl:template>
<xsl:template name="SumSet">
<xsl:param name="items" />
<xsl:if test="$items">
<xsl:variable name="currentValue">
<xsl:apply-templates select="$items[1]" />
</xsl:variable>
<xsl:variable name="remainderSum">
<xsl:call-template name="SumSet">
<xsl:with-param name="items" select="$items[position() > 1]" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$currentValue + $remainderSum"/>
</xsl:if>
<xsl:if test="not($items)">0</xsl:if>
</xsl:template>
<xsl:template match="Item">
<xsl:value-of select="cost * related_id/Item/quantity"/>
</xsl:template>
</xsl:stylesheet>
这是一种通用的方法,但由于您提到使用的是XslCompiledTransform,因此可以使用msxsl:node-set()
稍微简化此任务:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="values">
<xsl:apply-templates select="/*/Item" />
</xsl:variable>
<xsl:value-of select="sum(msxsl:node-set($values)/*)"/>
</xsl:template>
<xsl:template match="Item">
<itemValue>
<xsl:value-of select="cost * related_id/Item/quantity"/>
</itemValue>
</xsl:template>
</xsl:stylesheet>
在输入XML上运行时,这也会产生值
580
。xsl:sequence
是XSLT 2.0的一项功能,XslCompiledTransform仅支持XSLT 1.0。您的源XML看起来像什么?我的源XML看起来像:4025010
那我该怎么办?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="values">
<xsl:apply-templates select="/*/Item" />
</xsl:variable>
<xsl:value-of select="sum(msxsl:node-set($values)/*)"/>
</xsl:template>
<xsl:template match="Item">
<itemValue>
<xsl:value-of select="cost * related_id/Item/quantity"/>
</itemValue>
</xsl:template>
</xsl:stylesheet>