2011-05-31 45 views
1

基于来自另一节点的标准验证一个节点我试图根据其ID标识的文档中不同元素中的条件来验证子元素的存在。使用ISO Schematron和XPath 2.0。通过引用标准的@ID

采取下面的例子:

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

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

元素“increased_sensitivity”应只允许如果与@id a“值”元件“红”包含在文档中的属性位=“16”某处。要完全诚实地说,我甚至不确定Schematron可以做到这一点,但我的经验非常有限。

回答

0

假设您想要查找ID与foo id值匹配的值元素(在本例中为“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> 

+0

感谢您的快速响应!不幸的是,我现在意识到我的问题不太清楚。模式规则需要匹配指定的value_id是否为foo元素的发生,而不是特定的“红色”id。 @value_id在xsd:IDREF中被模式化,因此可以是文档中其他地方定义的任何ID。 – XedMada 2011-05-31 20:31:05

+0

我意识到这是你可能意味着什么,因为我读回来 - 现在的答案做你想做的我想! :-) – alexbrn 2011-05-31 20:32:51

+0

啊,是的,这不仅可以起到作用,它还揭示了一种更好的技术,我可以用它来弄清楚我遇到的其他问题。非常感谢。 – XedMada 2011-05-31 21:43:26