2012-08-07 23 views
0

我有一個文件是這樣的:如何針對名稱空間的模式進行驗證,而不是完整的文檔?

<d:block xmlns:d="D" xmlns:b="B" xmlns="default" name="popover"> 
    <d:description>...</d:description> 
    <d:sample> 
    <b:popover> 
     ...some b:stuff... 
    </b:popover> 
    </d:sample> 
</d:block> 

模式對本文件看起來像:

<grammar xmlns="http://relaxng.org/ns/structure/1.0"> 
    <start> 
     <element name="block" ns="D"> 
      <attribute name="name"/> 
      <element name="description"> 
       <text/> 
      </element> 
      <element name="sample"> 
       <ref name="anything"/> 
      </element> 
     </element> 
    </start> 
    <define name="anything"> 
     <element> 
      <anyName> 
       <except> 
        <nsName ns="D"/> 
       </except> 
      </anyName> 
      <zeroOrMore> 
       <choice> 
        <attribute> 
         <anyName/> 
        </attribute> 
        <text/> 
        <ref name="anything"/> 
       </choice> 
      </zeroOrMore> 
     </element> 
    </define> 
</grammar> 

「任何東西」 的字面意思是什麼,但d-命名空間。

我想爲B命名空間創建另一個模式,以針對任何包含B:命名空間的任意XML使用它。

如何爲名稱空間而不是整個文檔創建架構?

不能得到這個。

回答

0

像這樣的模式應該工作。您只需在名爲BElementsdefine元素中定義B名稱空間的元素。

<grammar xmlns="http://relaxng.org/ns/structure/1.0"> 
    <start> 
     <ref name="anythingOrB"/> 
    </start> 
    <define name="anythingOrB"> 
     <choice> 
      <ref name="BElements"/> 
      <ref name="anythingExceptB"/> 
     </choice> 
    </define> 
    <define name="anythingExceptB"> 
     <element> 
      <anyName> 
       <except> 
        <nsName ns="B"/> 
       </except> 
      </anyName> 
      <zeroOrMore> 
       <choice> 
        <attribute> 
         <anyName/> 
        </attribute> 
        <text/> 
        <ref name="anythingOrB"/> 
       </choice> 
      </zeroOrMore> 
     </element>  
    </define> 
    <define name="BElements"> 
     <choice> 
      <element name="elt1" ns="B"> 
       <empty/> 
      </element> 
      <element name="elt2" ns="B"> 
       <empty/> 
      </element> 
     </choice> 
    </define> 
</grammar> 
相關問題