xml - 将当前元素的子元素/子属性与以下元素的子元素/子属性进行比较
问题描述
我正在尝试编写 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>
敌人这个元素我得到了断言失败
解决方案
我假设您正在使用 XSLT 2.0 绑定。
如果是这样,则将子元素的属性与每个后续兄弟元素的子元素的属性End/@value = following-sibling::test/Origin/@value
进行比较。如果任何值匹配,则计算结果为 true 。这可能不是你想要的。value
End
value
Origin
test
Origin/@value
End
和Origin
元素都是元素的子元素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/@value
test
test
<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
.
推荐阅读
- ruby-on-rails - Rails 5 从表中获取特定字段/值
- docker - 为什么这个 apt-key adv 命令会出错?
- azure - Azure 应用服务 - ASPNETCORE_ENVIRONMENT - 多值问题
- python - 将任意长度列表传递给自定义层的巧妙方法
- c++ - Questions about multithread UDP Client-Server architecture
- javascript - Javascript 中的“TimeEvent”对象是什么?它有哪些方法和属性?
- apache-spark - Spark SQL - 在 SQl Notebook 中声明和使用变量
- c# - 如何将结果保存在执行命令的字符串中
- vb.net - 如何修复循环语句的凯撒密码以进行加密?
- react-native - 反应原生,在屏幕之间移动