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

XSLT 1中求和时多过滤条件失效问题排查与解决

解决XPath 1.0中组合双条件计算age属性之和的问题

需要计算XML中满足以下两个条件的<C>元素的age属性总和:

  • name属性不包含指定字符串
  • <address>元素为空(无内容或自闭合)

原始XML示例

<A>
    <B>
        <C name="test name1" age="10">
            <id>1</id>
            <address/>
        </C>
        <C name="test name2" age="20">
            <id>2</id>
            <address>test address</address>
        </C>
        <C name="test name3" age="30">
            <id>3</id>
            <address/>
        </C>
    </B>
</A>

你尝试的两种XPath写法

第一种:

<xsl:variable name="total-age" select="sum(A/B/C[not(contains(@name,'testString')) and (address = '')]/@age)" />

第二种:

<xsl:variable name="total-age" select="sum(A/B/C[not(contains(@name,'testString'))][address = '']/@age)" />

问题原因

在XPath 1.0中,直接用address = ''判断空元素可能存在兼容性问题——部分处理器对自闭合元素的字符串值判断逻辑有差异,导致条件组合后失效。

解决方案

改用更严谨的空元素判断方式,确保两个条件同时生效:

方案1:判断<address>无任何子节点

严格匹配自闭合或完全空的<address>元素:

<xsl:variable name="total-age" select="sum(A/B/C[not(contains(@name,'testString')) and not(address/node())]/@age)" />

方案2:明确取<address>的字符串值判断为空

通过string()函数强制获取元素的字符串值,避免处理器差异:

<xsl:variable name="total-age" select="sum(A/B/C[not(contains(@name,'testString')) and string(address) = '']/@age)" />

方案3:忽略空白字符的空判断(兼容带空白的空元素)

如果XML中存在<address> </address>这类含空白的空元素,可使用normalize-space()去除空白后判断:

<xsl:variable name="total-age" select="sum(A/B/C[not(contains(@name,'testString')) and normalize-space(address) = '']/@age)" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:30:47