XSL 1.0减去每个xsl:for-each

时间:2014-10-07 12:28:47

标签: xml xslt for-loop each subtraction

我正在浏览可用的答案,但找不到我理解的答案,也不适用于我的案例,所以我会用这个问题试一试。

我有一个像这样构建的文档

/
<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,它是每张纸的产品数量。

非常感谢提前。

2 个答案:

答案 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 &lt;= 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>