2013-03-20 59 views
1

我有一個好像是相同的元素名稱,但不同的驗證邏輯

<doc> 
<field name="simple_meta">book</field> 
<field name="complex_meta">journal</field> 
<field name="text_date">some text</field> 
</doc> 

我想通過模式爲基於「name」屬性值來驗證元素文本的XML文件。也就是說,如果屬性的值是「simple_meta」,我想對「simpleRestriction」進行驗證,以防「complex_meta」進行「complexRestriction」驗證。問題是我無法在同一節點下定義具有相同名稱的元素。有人可以幫我解決這個問題嗎?

<xs:schema ......> 
    <xs:simpleType name="simpleRestriction"> 
     <xs:restriction base="xs:string"> 
     <xs:maxLength value="20"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="complexRestriction"> 
     <xs:restriction base="xs:string"> 
     <xs:maxLength value="10"/> 
     <xs:pattern value="([\w])*"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="str"> 
     <xs:complexType> 
     <xs:simpleContent> 
      <xs:extention base="simpleRestriction"> 
       <xs:attribute name="name"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="simple_meta"/> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extention> 
     </xs:simpleContent> 
     </xs:ComplexType> 
    </xs:element> 
    <xs:element name="str"> 
     <xs:complexType> 
     <xs:simpleContent> 
      <xs:extention base="complexRestriction"> 
       <xs:attribute name="name"> 
        <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="complex_meta"/> 
        </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extention> 
     </xs:simpleContent> 
     </xs:ComplexType> 
    </xs:element> 
</xs:schema> 
+1

這不能用XSD 1.0完成 - 你需要d其他系統(Schematron或RelaxNG或XSD 1.1也許,但我不熟悉它們) – MiMo 2013-03-21 20:19:02

回答

1

簡短的回答是:不這樣做。

XSD旨在驗證基於元素名稱(主要是簡單情況下)的元素。如果您有三種不同的驗證邏輯,那麼您最好告訴XSD驗證程序有三種類型的元素(可能命名爲simple_meta,complex_meta和test_date),而不是不合理地聲稱只有一種元素類型。使用通用的基本類型來明確三種元素的類型之間的關係,或使用一個通用的替代組來將三種元素類型本身相關聯。如果你真的必須那樣做,或者如果你真的知道你在做什麼,並且想要做到這一點(我不確定這種組合是否可能,但我會盡量在這裏開闊視野) ,您的基本選項:在實例

  • 使用xsi:type指定實例中的各個元素的類型(大致類似於您name屬性,但名稱的類型在模式中聲明)

  • 使用XSD 1.1和條件類型分配

  • 使用XSD 1.1和斷言

或者離開XSD背後:

  • 使用的Schematron和斷言

  • 使用RelaxNG和屬性的不同值寫入的內容模型

相關問題