2011-04-05 64 views
4

是否有可能使Relax NG元素/屬性獨一無二?放鬆NG和元素/屬性的獨特性

例如屬性:

<rng:attribute name="test"> 
     <rng:ref name="options"/> 
</rng:attribute> 

引用:

<rng:define name="options"> 
    <rng:choice> 
     <rng:value>t1</rng:value> 
     <rng:value>t2</rng:value> 
     <rng:value>t3</rng:value> 
    </rng:choice> 
</rng:define> 

現在我要驗證一個XML,這不應該使用的 「選項」 一兩次。換句話說:在xml中不應該出現兩次「t1」...

我讀過一些關於schematron的內容。但是還有另一種可能嗎?

回答

0

您的模式片段可以按原樣使用。

架構:

 
<?xml version="1.0"?> 
<rng:element xmlns:rng="http://relaxng.org/ns/structure/1.0" name="doc"> 
    <rng:attribute name="test"> 
    <rng:choice> 
     <rng:value>t1</rng:value> 
     <rng:value>t2</rng:value> 
     <rng:value>t3</rng:value> 
    </rng:choice> 
    </rng:attribute> 
</rng:element> 

允許屬性測試,以要麼 「T1」, 「T2」 或 「T3」 的值。如果它包含其他內容,則RELAX NG驗證器將發出驗證錯誤消息。例如在這種情況下,jing報告

"[Jing] value of attribute "test" is invalid; must be equal to "t1", "t2" or "t3"

2

不,Relax NG不支持唯一性約束和參照完整性約束。正如詹姆斯·克拉克說,在a paper on the design of Relax NG

的RELAX NG TC花了大量的時間考慮怎樣支持RELAX NG應爲執行標識(獨特性和交叉引用)的約束。最後,結論是身份約束被更好地分離成單獨的規範。因此,RELAX NG本身不支持身份限制。

爲了兼容XML DTD,RelaxNG確實支持檢查ID/IDREF約束。但是這是最容易遇到處理器之間的不一致以及新用戶混淆的領域之一。

您的選項包括

  • 使用另一種模式語言(Schematron的考慮,DTD,XSD)制定和實施這一限制(這些在應用層
  • 檢查值的唯一性,Schematron的可能在實踐中最容易使用,作爲在特定點上補充RelaxNG的一種方式,但將大部分工作留給RelaxNG)
  • 調整XML,以便在元素名稱中表示t1,t2和t3之間的區別,模型可以強制其獨特性;這不一定是可能的