(XSLT)如何根据兄弟节点对值求和

时间:2015-09-04 13:14:30

标签: xml xslt sum

我遇到了XSLT问题。当发票编号不是以字母“M'”开头时,我想总结所有小计值。我遇到的问题是我使用SUM函数,但我不知道如何给它条件。

我过去曾使用过IF结构,但它们被用来生成一个类似于" 456 + 415"我需要一个总和数字。

以下是我要翻译的XML:

<PriceSheets>
    <PriceSheet>
        <SubTotal>456</SubTotal>
        <Settlement>
            <InvoiceNumber>M1234567890</InvoiceNumber>
        </Settlement>
    </PriceSheet>
        <SubTotal>415</SubTotal>
        <Settlement>
           <InvoiceNumber>1234567891</InvoiceNumber>
        </Settlement>
    <PriceSheet>
    </PriceSheet>
</PriceSheets>

在这种情况下,我希望看到&#34; 415&#34;。任何帮助将不胜感激!

由于

PS:我以前用过

<xsl:value-of select="sum(PriceSheets/PriceSheet/SubTotal/text())" />

对所有值求和,但问题是我需要在求和之前查看Settlement / InvoiceNumber节点。

3 个答案:

答案 0 :(得分:0)

您的XML看起来无效,但假设每个PriceSheet都有一个Settlment元素和一个SubTotal元素,那么您需要这样:

<xsl:value-of 
  select="sum(PriceSheets/PriceSheet[substring(Settlement/InvoiceNumber, 1, 1)<>'M']/SubTotal/text())" />

答案 1 :(得分:0)

您想要选择所有小计,其中兄弟结算节点的发票人数并非以&#39; M&#39;

开始:

<xsl:value-of select="sum(//SubTotal[substring(../Settlement/InvoiceNumber, 1, 1) != 'M'])" />

答案 2 :(得分:0)

谢谢大家的投入!我用你的例子来获取工作代码!

sum(PriceSheets/PriceSheet[substring(Settlement/InvoiceNumber/text(), 1, 1) != 'M']/SubTotal/text())

我还试验了其他有用的东西:

<xsl:value-of select="sum(PriceSheets/PriceSheet[not(starts-with(Settlement/InvoiceNumber, 'M'))]/SubTotal/text())" />

这两个对我有用!谢谢大家:)