通过引用条件的@ID,根据来自另一个节点的条件验证一个节点

时间:2011-05-31 17:28:16

标签: xml validation schematron

我正在尝试根据其ID标识的文档中的不同元素中的条件来验证子元素的存在。使用ISO Schematron和XPath 2.0。

采用以下示例:

<value id="red" bits="16" />

<foo value_id="red">
    <increased_sensitivity/>
</foo>

只有当带有@id“red”的“value”元素在文档中的某处包含属性bits =“16”时,才允许使用“increase_sensitivity”元素。

说实话,我甚至不确定Schematron可以做到这一点,我对它的经验非常有限。

1 个答案:

答案 0 :(得分:0)

假设您要查找其ID与foo id值匹配的value元素(在本例中为“red”),然后检查那里的位值,那么此Schematron架构显示了一种可行的方法:


<?xml version="1.0"?>    
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron">

  <sch:let name="root" value="/"/>

  <sch:pattern>
    <sch:rule context="increased_sensitivity">
      <sch:let name="id" value="parent::*/@value_id"/>
      <sch:let name="assoc-bits-value" value="$root//value[@id=$id]/@bits"/>
      <sch:assert test="$assoc-bits-value = 16">When the increased_sensitivity element is used, a
        corresponding value element must exist in the doucment with a bits value of
        "16".</sch:assert>
    </sch:rule>
  </sch:pattern>

</sch:schema>