2012-11-03 52 views
2

目標是創建一個擴展現有XML模式的XML模式,以便可以使用基本XSD或擴展XSD驗證生成的實例文檔。擴展現有的XSD並允許後向驗證

下面是一個例子鹼XSD:

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:dx="dataxsd/1" 
    targetNamespace="dataxsd/1" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:complexType name="DataType"> 
     <xs:sequence> 
      <xs:element name="Start" type="xs:dateTime" minOccurs="0"/> 
      <xs:element name="End" type="xs:dateTime" minOccurs="0"/> 
      <xs:element name="Value" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute name="type" type="xs:integer"/> 
     <xs:anyAttribute namespace="##other" processContents="lax"/> 
    </xs:complexType> 

    <xs:element name="Data" type="dx:DataType"></xs:element> 
</xs:schema> 

我想延長它使一個超集。我最初的方法是使用xs:redefine功能類似於:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:dx="dataxsd/1" 
    targetNamespace="dataxsd/1" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:redefine schemaLocation="data.xsd"> 
     <xs:complexType name="DataType"> 
      <xs:complexContent> 
       <xs:extension base="dx:DataType"> 
        <xs:sequence> 
         <xs:element name="Status" type="xs:string" minOccurs="0"/> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:redefine> 
</xs:schema> 

使用oXygen 14.1這兩個模式都驗證成功。

由於xs:任何名稱空間只允許「##其他」,包含擴展模式的實例文檔將不會針對非擴展模式進行驗證,因此xs:redefine要求擴展名位於相同的名稱空間中。

它不希望更改基礎架構,但我改變它來設置XS試驗:任何命名空間限制爲「##任」的XSD本身不會驗證時,Xerces的抱怨是:

cos-nonambig: "dataxsd/1":Start and WC[##any] (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles. 

我也嘗試過XML Schema 1.1 xs:override功能,因爲xs:redefine現在在1.1中已被棄用,但我永遠無法得到它來正確驗證,並且支持似乎處於非常早期的階段。

是否有任何方法可以實現擴展原始基本模式並允許包含擴展的實例文檔使用基本非擴展模式進行驗證的目標?

回答

1

放寬命名空間限制會在將<xd:Start>元素與<xs:element name="Start"/>規則進行匹配或將其全部跳過並將其與<xs:any />規則進行匹配之間產生歧義。對於其他預定義的元素也是如此。

在正則表達式中,在這種情況下,您將使用貪婪量詞,但XSD語言不區分greedy and lazy

目前的情況是,有兩種方法來解決這個問題:

  • 選擇在第二個文件的另一個名稱空間。
  • 使第一個文件中最後定義的元素爲必需,並且不可重複:minOccurs="1" maxOccurs="1"。也許包裝價值在一個<xd:Values> - 元素。

瞭解更多:

+0

感謝馬庫斯。另一個命名空間不能與我知道的'redefine'一起使用,也使用'import'或'include'意味着現有的模式類型不能被擴展。不幸的是,我不能使用第二個想法來使最後定義的元素成爲必需和不可重複的元素,因爲這是跨越很多元素的,並且許多元素必然只包含可選元素。 – terse