如何在XPath 1版本中测试(孙)子节点值是否相等?
判断XPath 1.0中director与presenter节点值是否相等的实现
嘿,这个需求在XPath 1.0里其实挺直接的,我给你一步步拆解清楚怎么实现:
核心表达式(筛选符合条件的Cinema节点)
如果你想直接选出director和presenter值相等的<Cinema>节点,用这个表达式就可以:
/Cinema[directors/director = crew/presenter]
它的逻辑很简单:遍历根节点下所有<Cinema>元素,只保留那些内部directors/director节点的字符串值和crew/presenter节点字符串值完全匹配的节点。
直接返回布尔值(明确判断是否相等)
要是你只需要一个true()或false()的结果来确认两者是否相等,就用boolean()函数包装一下表达式:
boolean(/Cinema/directors/director = /Cinema/crew/presenter)
这个写法会直接输出布尔值,清晰告诉你两个节点的内容是否一致。
几个要注意的细节
- 大小写敏感:XPath 1.0的字符串比较是严格区分大小写的,比如"Morgan Freeman"和"morgan freeman"会被判定为不相等。
- 空白字符的影响:节点文本里的换行、首尾空格、中间连续空格都会被算进字符串值里。如果你的XML因为格式缩进带有多余空白,可以用
normalize-space()函数处理,避免误判:boolean(normalize-space(/Cinema/directors/director) = normalize-space(/Cinema/crew/presenter))normalize-space()会自动去掉文本首尾空白,把中间连续空白替换成单个空格,让比较更精准。
实际测试示例
用你提供的XML:
return (<Cinema> <directors> <director>Morgan Freeman</director> </directors> <crew> <presenter>Morgan Freeman</presenter> </crew> </Cinema> )
- 用
/Cinema[directors/director = crew/presenter]会成功选中这个<Cinema>节点; - 用
boolean(...)会返回true(); - 如果把
<presenter>的内容改成"Morgan F",表达式就会返回false()。
内容的提问来源于stack exchange,提问作者Colin Jack
相关产品推荐
相关产品推荐

