2012-05-24 68 views
2

允許元素的任意順序我有一個RelaxNG模式,它看起來非常像這樣:在RelaxNG模式

<grammar xmlns="http://relaxng.org/ns/structure/1.0"> 
    <start> 
    <element name="xml"> 
     <zeroOrMore> 
     <element name="multi"> 
      <data type="string"/> 
     </element> 
     </zeroOrMore> 
     <optional> 
     <element name="optional"> 
      <data type="string"/> 
     </element> 
     </optional> 
    </element> 
    </start> 
</grammar> 

我想允許0-N multi標籤,但0-1 optional。只要能正常工作的複合音色來之前可選的,但由於relative order matters in RNG,它失敗,如果他們來了之後:

有效期:

<xml> 
    <optional/> 
</xml> 

<xml> 
    <multi/> 
    <multi/> 
    <optional/> 
</xml> 

無效:

<xml> 
    <optional/> 
    <multi/> 
    <multi/> 
</xml> 

所以,我怎麼能允許任意順序但保留約束?我嘗試在<zeroOrMore><choice>塊中包裝整個事物,並允許任意順序,但也允許任意數量的可選標記通過。

回答

4

如果我理解正確的話你的問題,你要實現的目標是通過使用<interleave/>模式的實現:

<?xml version="1.0" encoding="UTF-8"?> 
<grammar xmlns="http://relaxng.org/ns/structure/1.0"> 
    <start> 
     <element name="xml"> 
      <interleave> 
       <zeroOrMore> 
        <element name="multi"> 
         <data type="string"/> 
        </element> 
       </zeroOrMore> 
       <optional> 
        <element name="optional"> 
         <data type="string"/> 
        </element> 
       </optional>     
      </interleave> 
     </element> 
    </start> 
</grammar> 

這將驗證任何順序或零個或一個optional元素和零個或多個multi元素包括你的例子。

+0

輝煌,謝謝! – jpatokal