首页 > 解决方案 > 将当前元素的子元素/子属性与以下元素的子元素/子属性进行比较

问题描述

我正在尝试编写 schematron 规则来比较循环中当前子元素(End @value)的属性与下一个子元素属性(Origin @value)。我不确定我是否做对了,所以这是我的尝试

这是我的尝试:

<sch:rule context="test">
    <sch:assert test="End/@value = following-sibling::test/Origin/@value " >Both the value are not Equal. </sch:assert>
</sch:rule>

这条规则在最后一个元素之前工作正常,最后一个元素期待另一个不存在的元素。问题可能出在 "following-sibling" 上。

这是 XML 文件:

<tests>
<test x="-276.724" xEnd="-276.193">
    <Origin value="36.599"/>
    <End value="36.6"/>
</test>
<test x="-276.193" xEnd="-260.29">
    <Origin value="36.6"/>
    <End value="36.603"/>
</test>
<test x="-260.29" xEnd="-240.194">
    <Origin value="36.603"/>
    <End value="36.601"/>
</test>
<test x="-240.194" xEnd="-220.046">
    <Origin value="36.601"/>
    <End value="36.601"/>
</test>
<test x="-220.046" xEnd="-200.09">
    <Origin value="36.601"/>
    <End value="36.602"/>
</test>

预期结果:由于当前子元素(End @value)=下一个子元素属性(Origin @value),输出应该是成功的。

实际结果。

    <test x="-220.046" xEnd="-200.09">
    <Origin value="36.601"/>
    <End value="36.602"/>
</test>

敌人这个元素我得到了断言失败

标签: xmlxpathschematron

解决方案


我假设您正在使用 XSLT 2.0 绑定。

如果是这样,则将子元素的属性与每个后续兄弟元素的子元素的属性End/@value = following-sibling::test/Origin/@value进行比较。如果任何值匹配,则计算结果为 true 。这可能不是你想要的。valueEndvalueOrigintestOrigin/@value

EndOrigin元素都是元素的子元素test,它是 XPath 表达式的上下文。如果要测试两个子元素:

<sch:rule context="test">
  <sch:assert test="End/@value = Origin/@value"
  >Both the  value are not Equal. </sch:assert>
</sch:rule>

如果您想使用来自以下元素的End/@value来自当前test元素的测试但在没有以下元素时不会失败:Origin/@valuetesttest

<sch:rule context="test[exists(following-sibling::test[1])]">
  <sch:assert test="End/@value = following-sibling::test[1]/Origin/@value"
  >Both the  value are not Equal. </sch:assert>
</sch:rule>

[1]XPath 限制为仅选择第一个test.


推荐阅读