我正在浏览可用的答案,但找不到我理解的答案,也不适用于我的案例,所以我会用这个问题试一试。
我有一个像这样构建的文档
/
<quantity>5900</quantity>
<paper_detail_summary>
<pd_sheets_std>9853</pd_sheets_std>
</paper_detail_summary>
<route_detail>
<no_up>1<no_up>
</route_detail>
<route_detail>
<no_up>2<no_up>
</route_detail>
总和是&#34; paper_detail_summary / pd_sheets_std - (数量div route_detail / no_up)&#34;其中(quantity div route_detail / no_up)必须适用于每次出现的route_detail,并从paper_detail_summary / pd_sheets_std
左侧的内容中减去9853 - (5900 div 1)= 3953
3953 - (5900 div 2)= 1003
因此得到所需的值1003
请注意,no_up不是自动增加值,例如,它可能是2和4,它是每张纸的产品数量。
非常感谢提前。
答案 0 :(得分:0)
这是你可以看到它的一种方式:
给出格式正确的输入:
<root>
<quantity>5900</quantity>
<paper_detail_summary>
<pd_sheets_std>9853</pd_sheets_std>
</paper_detail_summary>
<route_detail>
<no_up>1</no_up>
</route_detail>
<route_detail>
<no_up>2</no_up>
</route_detail>
</root>
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/root">
<xsl:variable name="quotients">
<xsl:for-each select="route_detail">
<quotient>
<xsl:value-of select="../quantity div no_up"/>
</quotient>
</xsl:for-each>
</xsl:variable>
<result>
<xsl:value-of select="paper_detail_summary - sum(exsl:node-set($quotients)/quotient)"/>
</result>
</xsl:template>
</xsl:stylesheet>
将返回:
<?xml version="1.0" encoding="UTF-8"?>
<result>1003</result>
答案 1 :(得分:0)
这是一个使用递归模板的解决方案。它计算最终总和并将其存储在变量$finalSum
中。您可以尝试here。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<xsl:variable name="finalSum">
<xsl:call-template name="processSum">
<xsl:with-param name="sheets" select="number(paper_detail_summary/pd_sheets_std/text())" />
<xsl:with-param name="quantity" select="number(quantity/text())" />
<xsl:with-param name="routeDetail" select="route_detail" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$finalSum" />
</xsl:template>
<xsl:template name="processSum">
<xsl:param name="currPos" select="'1'" />
<xsl:param name="sheets" />
<xsl:param name="quantity" />
<xsl:param name="routeDetail" />
<xsl:if test="$currPos <= count($routeDetail)">
<xsl:variable name="sum" select="$sheets - ($quantity div number($routeDetail[$currPos]/no_up))" />
<xsl:if test="$currPos = count($routeDetail)">
<xsl:value-of select="$sum" />
</xsl:if>
<xsl:call-template name="processSum">
<xsl:with-param name="currPos" select="$currPos + 1" />
<xsl:with-param name="sheets" select="$sum" />
<xsl:with-param name="quantity" select="$quantity" />
<xsl:with-param name="routeDetail" select="$routeDetail" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>