Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSL 1.0减去每个XSL:for-each_Xml_Xslt_For Loop_Each_Subtraction - Fatal编程技术网

Xml XSL 1.0减去每个XSL:for-each

Xml XSL 1.0减去每个XSL:for-each,xml,xslt,for-loop,each,subtraction,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&

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

我有一份文件是这样建立起来的

/
<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>
/
5900
9853
1.
2.
该总和为“纸张详细信息汇总/pd张数标准-(数量分配路线详细信息/no张数)”,其中(数量分配路线详细信息/no张数)必须适用于路线详细信息的每次出现,并从纸张详细信息汇总/pd张数标准的剩余部分中减去

9853-(5900第1部分)=3953

3953-(5900第2部分)=1003

从而得到期望值1003

请注意,no_up不是一个自动增加的值,它可以是2和4,例如,它是每张纸的产品数


非常感谢。

这里有一种方法可以让你看看:

给定格式良好的输入:

<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>

5900
9853
1.
2.
以下样式表:

XSLT1.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>

1003

这是一个使用递归模板的解决方案。它计算最终总和并将其存储在变量
$finalSum
中。你可以试试看



Hi Micheal.hor257k,我无法实现上述解决方案,因为处理XML的程序只接受XSLT 1.0,不接受其他处理器。尝试了,但返回了一个错误,无法绑定var商。谢谢你的意见。问候语,忽略语对于可以使用exsl的人,结果部分应该是书面的、详细的、总结的/pd的、表格的、标准的和(…)问候语,Ignotus@Ignotus你确定吗?您使用的是哪种处理器?它是我们用于在机器上收集数据的软件包附带的处理器。有没有办法让我检查一下。我收到的错误与另一个解决方案相同,顺便说一句:“无法解析对变量或参数‘sum’的引用。变量或参数可能未定义,或者可能不在范围内”,但请使用您的参数名称。我想要实现的是使用表中模板根中某个地方的变量输出,最好使用@Ignotus调用来标识您的处理器:Hi GentelepurpleRain,谢谢您的回答。我尝试实现它,将模板匹配根部分放在文档的当前根部分中。将模板processSum放在/样式表内,但放在模板根目录外,如上所述。如果我在模板根中使用变量$sum和xsl:value of select,它将无法识别返回的变量sum。我不明白其中的一个部分,xsl:if,它是否也会循环,还是因为“while”不是xsl的选项?提前谢谢。问候Ignotus完全错误为:转换XML时出错。错误消息为:无法解析对变量或参数“sum”的引用。变量或参数可能未定义,或者不在范围内。我还发现了此设置的错误之处。第一部分显示值,例如3953和1003,两者之间没有空格。我怎样才能让它只显示1003号?@Ignotus:我已经更新了答案,希望能回答您的问题。无法在主模板中使用变量
$sum
,因为它没有在主模板中定义。它仅在递归模板中定义。我已将递归调用的结果分配给一个新变量
$finalSum
,然后将其打印出来。这是你想要的吗?
<?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>