我想使用Schematron比较两个XML文件。我有一个模板,如下所示:
<action name="thirdAction" id="3">
<return-values>
<return-value name="communication-profile-id" />
<return-value name="messaging-profile-id" />
</return-values>
当一个人创建一个动作的实例时,它看起来像这样:
<instanceOfAction name="thirdAction" id="3">
<results>
<result name="communication-profile-id" />
<result name="messaging-profile-id" />
</results>
</instanceOfAction>我希望根据id将instanceOfAction映射到给定的操作,然后检查子元素的名称是否一致。在我的层次结构中,我有很多动作,这使得这一点变得更加困难。有没有人对实现这一点有建议?通过执行以下操作,我成功地检查了instanceOfAction中的结果是否在某个定义的操作中,而不是特定地在具有相同id的操作中:
<sch:rule context="//ts:instanceOfAction/ts:results/ts:result">
<sch:assert test="$testspecification//(ts:actions/ts:action/ts:return-values/ts:return-value)[@name= current()/@key]">
The keys from the results do not match with the names from the return-values.
</sch:assert>
</sch:rule>其中变量XML是根层次结构的路径,它包含所有$testspecification文件。
任何帮助或想法都将不胜感激。:)
发布于 2018-04-11 00:53:47
可以使用xPath谓词查找匹配的action,就像查找匹配的return-value一样。您可以使用..上一级(或使用ancestor::轴)。
<sch:rule context="//ts:instanceOfAction/ts:results/ts:result">
<sch:assert test="$testspecification//ts:actions/ts:action[@id= current()/../../@id]/ts:return-values/ts:return-value[@name= current()/@key]">
The keys from the results do not match with the names from the return-values.
</sch:assert>
</sch:rule>如上所述,该规则的缺点是它不会捕获results缺少模板指定的result的情况。如果我正在编写规则,我可能会通过将上下文设置为ts:instanceOfAction来处理它,然后使用断言来验证instanceOfAction是否包含Action指定的所有内容,如下所示:
<sch:rule context="ts:instanceOfAction">
<sch:assert test="every $returnValue in $testspecification//ts:actions/ts:action[@id= current()/@id]/ts:return-values/ts:return-value satisfies $returnValue/@name = current()/ts:results/ts:result/@name and
every $result in ts:results/ts:result satisfies $result/@name = $testspecification//ts:actions/ts:action[@id= current()/@id]/ts:return-values/ts:return-value/@name">
The keys from the results should match with the names from the return-values.
</sch:assert>
</sch:rule>(我还没有测试过上面的示例,因此可能需要进行一些修改。)
从问题标题看,您可能也有兴趣断言与模板相比,result元素的顺序是正确的。您可以使用XPath position()函数帮助检查这一点。
https://stackoverflow.com/questions/49690952
复制相似问题