XSLT中检查节点存在性首选exists()(XSLT 2.0+),语义清晰;XSLT 1.0兼容方案为boolean()或count()>0,避免用title!=''等误判内容的写法。

在XSLT中检查一个节点是否存在,最常用、最直接的方式是使用 条件判断函数,比如 exists()(XSLT 2.0+)或 count() > 0(兼容 XSLT 1.0)。关键不在于“有没有这个标签”,而在于“当前上下文下能否选中到至少一个匹配的节点”。
用 exists() 判断(推荐,XSLT 2.0 及以上)
exists() 是语义最清晰的函数,专为“存在性检测”设计,返回布尔值。
- 检查子元素是否存在:
exists(child::title)或简写为exists(title) - 检查带条件的节点:
exists(book[@category='fiction']) - 常配合
使用:作者信息已提供
用 count() > 0(兼容 XSLT 1.0)
XSLT 1.0 没有 exists(),但可以用 count() 模拟:
-
count(title) > 0—— 表示至少有一个子元素 -
count(./@id) > 0—— 检查当前元素是否有id属性 - 注意:不要写成
count(title) = 1,那是在检查“是否恰好一个”,不是“是否存在”
用 boolean() 转换节点集(也兼容 XSLT 1.0)
节点集转布尔值时,空节点集为 false,非空为 true:
-
boolean(title)—— 简洁有效,语义明确 -
boolean(@lang)—— 检查属性是否存在 - 比
count() > 0更轻量,且可读性好,是 XSLT 1.0 下的优选写法
常见误区提醒
避免这些容易出错的写法:
- ❌
title != ''—— 这是在比较字符串值,如果(空元素)或只有空白符,可能误判 - ❌
string-length(title) > 0—— 同样依赖内容而非存在性;若节点存在但内容为空,结果为 false - ❌ 直接用
title当测试条件(如)—— 在 XSLT 1.0 中这是合法的,但行为是“取第一个匹配节点的字符串值再转布尔”,不如boolean(title)明确;XSLT 2.0+ 中这种写法虽仍可用,但语义模糊,不推荐
基本上就这些。选哪个取决于你的 XSLT 版本和团队习惯:新项目优先用 exists(),老系统稳妥用 boolean()。










