2011-05-31 49 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