You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT 2.0中使用变量排除节点集求和项的问题

XSLT 2.0 按分类排除求和:变量不生效问题解决

示例XML数据

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

基础求和代码及结果

直接对所有VALUE求和的代码:

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

输出结果:35

需求

需要排除指定ATTRTYPE(如annLeave、sickPaid等)对应的VALUE,示例数据期望输出8。

硬编码排除的可行方案

直接在条件中写死排除列表的代码可正常工作:

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

变量方式尝试失败场景

尝试用变量定义排除列表,但变量未生效,输出仍为35:
变量定义:

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

两种失效的查询代码:

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

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

解决方案

方案1:直接定义变量为字符串序列(推荐)

XSLT 2.0支持直接定义字符串序列变量,可直接用于比较过滤:

<xsl:variable name='excludeList' select="('otherLeave', 'leaveWOPay', 'annLeave', 'sickPaid', 'sickNotPaid')"/>

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

方案2:提取节点变量的文本值序列

如果要保留节点式的变量定义,需要提取ATTRTYPE节点的文本值形成序列再做比较:

<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[not(ATTRTYPE = $excludeList/ATTRTYPE/text())]/VALUE)"/>

原因说明:原变量$excludeList是包含ATTRTYPE节点的节点树,直接和RPTTIME/ATTRTYPE比较是节点对象的比对,而非文本值的匹配,所以需要提取文本值形成字符串序列才能正确过滤。

内容的提问来源于stack exchange,提问作者Rob Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:33:11