2012-02-15 84 views
2

我遇到了xml架構問題。XML架構內容模型不確定

首先,我想告訴你的XML的可能情況:

1.

<arrivalDate>01.01.2012</arrivalDate> 

2.

<arrivalDate>01.01.2012</arrivalDate> 
<departureDate>04.01.2012</departureDate> 

3.

<arrivalDate>01.01.2012</arrivalDate> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 

4.

如果被推薦者設置
<arrivalDate>01.01.2012</arrivalDate> 
<departureDate>04.01.2012</departureDate> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 

5.

<arrivalDate>later</arrivalDate> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 

6.

<arrivalDate>later</arrivalDate> 
<departureDate>5</departureDate> <!-- 1 till 5 extra days --> 
<presentee> 
    <firstName>User</firstName> 
</presentee> 

的情況5和6是唯一可能的。

現在我已經創建了一個架構處理這個問題:

<xs:choice> 
    <xs:sequence> 
     <xs:choice> 
      <xs:sequence> 
       <xs:element name="arrivalDate" type="date" /> 
       <xs:element name="departureDate" type="date" minOccurs="0" maxOccurs="1" /> 
      </xs:sequence> 
      <xs:sequence> 
       <xs:element name="arrivalDate" type="xs:string" fixed="later" /> 
       <xs:element name="departureDate" minOccurs="0" maxOccurs="1"> 
        <xs:simpleType> 
         <xs:restriction base="xs:integer"> 
          <xs:minInclusive value="1" /> 
          <xs:maxInclusive value="5" /> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:choice> 
     <xs:element name="presentee" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="title" type="title"/> 
        <xs:element name="firstName" type="name" /> 
        <xs:element name="lastName" type="name" /> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    <xs:sequence> 
     <xs:element name="arrivalDate" type="date" /> 
     <xs:element name="departureDate" type="date" minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
</xs:choice> 

我試了更改結構,韓德爾的問題,但IM沒有得到一個「好」的解決方案。

回答

2

這不是XSD 1.0可以處理的東西。 XSD模型是確定性的,正如你所意識到的那樣,你的語言不是確定性的。

您可以使用聯合有一個類型可以是日期或某些特定的字符串值,但XSD中沒有任何內容允許您指定當到達/離開不僅僅是日期時必須存在以後的元素。

我不知道XSD 1.1是否適合您,但它有斷言,這可能對您有所幫助。

1

您的XML架構不確定的原因是,將其應用於XML文檔時,無法確定您到達日期和出發日期的哪個定義。你的想法是,第一個<choice>指令可以讓你在這些元素的一組定義之間進行選擇,然後是一個presentee元素,或者另一個沒有presentee元素的定義。不幸的是,XML Schema不執行一些預測。

解析後,XML事件逐個呈現給驗證器。所以到達日期被賦予您的模式,現在它必須知道該元素是否有效,但是......它無法確定哪些到達日期定義適用。如果它可以在稍後解析後續元素時推遲該決定,則可以像它可能通過丟失某些子元素來決定元素是無效的那樣。但鑑於它們是分開的,這是不可能的。

W3C XML Schema在很多方面都不好:無序內容和跨節點限制。像Kevin建議的那樣,XML Schema 1.1可能會有答案。我沒有用過它。其他的選項是RelaxNG,它比XML Schema或者Schematron更加靈活和強大,它允許這種驗證需要比結構和簡單的類型檢查更深入。