XSLT多节点身份比较咨询:如何判断两个节点集是否完全相同?
比较XSLT节点集是否完全相同的简便方法
嘿,作为XSLT新手能关注到节点身份判断的细节,已经很赞啦!关于节点集$set1和$set2是否“完全相同”,其实得分两种场景(是要求节点顺序、数量、身份都一致,还是仅要求包含的节点完全相同不管顺序),而且不同XSLT版本的实现方式也有差异,我给你梳理一下:
XSLT 2.0及以上版本(推荐,语法更简洁)
XSLT 2.0+引入了序列和更强大的节点比较能力,处理起来很方便:
- 要求节点顺序、数量、每个节点身份完全一致:直接用等式比较即可,因为XSLT 2.0中节点序列的
eq操作会严格按顺序逐个验证节点身份是否相同:$set1 eq $set2 - 仅要求两个节点集包含的节点完全相同(不考虑顺序):可以结合
count()和every...satisfies来验证数量相等,且每个节点都存在于另一个集合中:
或者更简洁的方式,利用集合的相等性判断:count($set1) = count($set2) and every $node in $set1 satisfies $node is $set2
(注:$set1 is $set2is操作符在这里会忽略顺序,只判断两个集合是否包含完全相同的节点)
XSLT 1.0版本(兼容性更强,语法稍繁琐)
XSLT 1.0没有原生的序列比较能力,得用generate-id()来间接实现:
- 要求节点顺序、数量、每个节点身份完全一致:先验证数量相等,再把两个节点集里每个节点的
generate-id()拼接成字符串,比较字符串是否相同:count($set1) = count($set2) and concat('', $set1/generate-id(.)) = concat('', $set2/generate-id(.)) - 仅要求两个节点集包含的节点完全相同(不考虑顺序):同样先验证数量相等,再检查
$set1中没有任何节点不在$set2里:count($set1) = count($set2) and count($set1[not(generate-id(.) = $set2/generate-id(.))]) = 0
小提示
你提到的generate-id(.) == generate-id($someNode)确实是判断单个节点身份一致的标准方式,因为generate-id()会为每个节点生成唯一的标识字符串,同一个节点的标识永远相同。
内容的提问来源于stack exchange,提问作者TigEgal
相关产品推荐
相关产品推荐

