XSLT:想要使用变量从节点集总和中排除

问题描述 投票:0回答:1

我有一个 xml,其中有多个存储桶,这些存储桶被汇总到一个 Total 中

我正在使用xslt 2.0.....

       <RPTTIME>
            <ATTRTYPE>sickPaid</ATTRTYPE>
            <VALUE>9</VALUE>
        </RPTTIME>
        <RPTTIME>
            <ATTRTYPE>annLeave</ATTRTYPE>
            <VALUE>9</VALUE>
        </RPTTIME>
        <RPTTIME>
            <ATTRTYPE>sickPaid</ATTRTYPE>
            <VALUE>9</VALUE>
        </RPTTIME>
        <RPTTIME>
            <ATTRTYPE>regHour</ATTRTYPE>
            <VALUE>8</VALUE>
        </RPTTIME>

当前代码

<xsl:value-of select="sum(./RPTTIME/VALUE)"/>

结果:已报告 35 个

我被要求根据类型排除一些值(annLeave、sickPaid 等)。 示例数据中所需的输出为 8。

此代码有效

 <xsl:value-of select="sum(./RPTTIME[not(ATTRTYPE=('noMap','otherLeave','leaveWOPay','annLeave','sickPaid','sickNotPaid'))]/VALUE)"/>

我更喜欢使用变量。 这是我正在尝试的,但它被忽略了

<xsl:variable name='excludeList'>
  <ATTRTYPE>otherLeave</ATTRTYPE>
  <ATTRTYPE>leaveWOPay</ATTRTYPE>
  <ATTRTYPE>annLeave</ATTRTYPE>
  <ATTRTYPE>sickPaid</ATTRTYPE>
  <ATTRTYPE>sickNotPaid</ATTRTYPE>
</xsl:variable>

 <xsl:value-of select="sum(./RPTTIME[ATTRTYPE != $excludeList]/VALUE)"/>

结果:35

我也尝试过

<xsl:value-of select="sum(./RPTTIME[not(ATTRTYPE = $excludeList)]/VALUE)"/>

结果:35

xml xslt xslt-2.0 xsl-variable
1个回答
0
投票

给定格式良好的 XML 输入:

<ROOT>
  <RPTTIME>
    <ATTRTYPE>sickPaid</ATTRTYPE>
    <VALUE>9</VALUE>
  </RPTTIME>
  <RPTTIME>
    <ATTRTYPE>annLeave</ATTRTYPE>
    <VALUE>9</VALUE>
  </RPTTIME>
  <RPTTIME>
    <ATTRTYPE>sickPaid</ATTRTYPE>
    <VALUE>9</VALUE>
  </RPTTIME>
  <RPTTIME>
    <ATTRTYPE>regHour</ATTRTYPE>
    <VALUE>8</VALUE>
  </RPTTIME>
</ROOT>

你可以这样做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:variable name='excludeList'>
    <ATTRTYPE>otherLeave</ATTRTYPE>
    <ATTRTYPE>leaveWOPay</ATTRTYPE>
    <ATTRTYPE>annLeave</ATTRTYPE>
    <ATTRTYPE>sickPaid</ATTRTYPE>
    <ATTRTYPE>sickNotPaid</ATTRTYPE>
</xsl:variable>

<xsl:template match="/ROOT">
    <result>
         <xsl:value-of select="sum(RPTTIME[not(ATTRTYPE = $excludeList/ATTRTYPE)]/VALUE)"/>
    </result>
</xsl:template>

</xsl:stylesheet>

得到这个结果:

<?xml version="1.0" encoding="UTF-8"?>
<result>8</result>

注意语法:谓词

[not(value = $sequence)]
与您尝试的
[value != $sequence]
非常不同。请参阅此处的比较规则:https://www.w3.org/TR/2010/REC-xpath20-20101214/#id-comparisons

© www.soinside.com 2019 - 2024. All rights reserved.