首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Schematron比较2个XML文件中元素的顺序是否匹配

使用Schematron比较2个XML文件中元素的顺序是否匹配
EN

Stack Overflow用户
提问于 2018-04-06 18:40:50
回答 1查看 145关注 0票数 1

我想使用Schematron比较两个XML文件。我有一个模板,如下所示:

代码语言:javascript
复制
  <action name="thirdAction" id="3">      
<return-values>
  <return-value name="communication-profile-id" />
  <return-value name="messaging-profile-id" />
</return-values>

当一个人创建一个动作的实例时,它看起来像这样:

代码语言:javascript
复制
  <instanceOfAction name="thirdAction" id="3">     
    <results>
     <result name="communication-profile-id" />
     <result name="messaging-profile-id" />
    </results>
 </instanceOfAction>

我希望根据id将instanceOfAction映射到给定的操作,然后检查子元素的名称是否一致。在我的层次结构中,我有很多动作,这使得这一点变得更加困难。有没有人对实现这一点有建议?通过执行以下操作,我成功地检查了instanceOfAction中的结果是否在某个定义的操作中,而不是特定地在具有相同id的操作中:

代码语言:javascript
复制
   <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文件。

任何帮助或想法都将不胜感激。:)

EN

回答 1

Stack Overflow用户

发布于 2018-04-11 00:53:47

可以使用xPath谓词查找匹配的action,就像查找匹配的return-value一样。您可以使用..上一级(或使用ancestor::轴)。

代码语言:javascript
复制
<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指定的所有内容,如下所示:

代码语言:javascript
复制
<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()函数帮助检查这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49690952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档