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
相关产品推荐
相关产品推荐

