【发布时间】:2013-01-19 05:28:09
【问题描述】:
我希望能够根据子节点的值比较两个节点。使用= 运算符测试节点相等性只是比较各个节点的字符串值。我想根据它们的子节点中的值来比较它们。
更具体一点,我希望<a> 和<b>(如下)相等,因为@id 的值对于具有匹配@type 属性的<c> 元素也是相同的具有匹配的@id 属性。
<a>
<c type="type-one" id="5675"/>
<c type="type-two" id="3423"/>
<c type="type-three" id="9088"/>
</a>
<b>
<c type="type-one" id="5675"/>
<c type="type-two" id="3423"/>
</b>
但这些会有所不同:
<a>
<c type="type-one" id="5675"/>
</a>
<b>
<c type="type-one" id="2342"/>
</b>
我能开始看到的唯一解决方案是与 for-each 语句进行费力的比较,如果可能的话,我想避免这种情况。
如果可能的话,我想坚持使用 XSLT 1.0。我正在使用 xsltproc。
【问题讨论】:
-
当
a的子元素<c type="type-three" id="9088"/>没有b的对应子元素时,第一个示例中的a和b如何“相等”? ?请编辑问题并更正。当前示例与“平等”的概念相矛盾。 -
没有单一的相等定义...例如,具有相同内部文本的节点在某种意义上是相等的,但这不是我感兴趣的区别。或者在现实生活中,也许两个人在 Stack Overflow 中享有同等的声誉,但工资不等,等等等等......
-
user1447002,相等被严格定义为等价关系——如果~是相等,它必须是1.自反,2.对称和3.传递。你没有这些——你还没有定义你称之为“平等”的关系的所有属性。
-
user1447002,你的“平等绝对是不传递的。
-
我的定义不是自反的、对称的还是传递的?如果所有属性值都与 A/@* 和 B/@* 的交集匹配,则 A“等于”B。这对我来说似乎是自反的、对称的和传递的。