2013-07-10 20 views
0

目標:是否可以在XSD中使用xs:重新定義xs:complexType元素以要求type屬性?

  1. 創建在需要爲每一個XS「類型」屬性的XSD:在架構中定義元素

  2. 能夠重新使用重新定義http://www.w3.org/2001/XMLSchema其他架構強制所有定義的xs:元素(一個或多個)要求的「類型」屬性

例如,我想下面的是在我們的XSD(如XMLSpy的)「無效」

<xs:element name="SomeElement"/> 

而以下將是有效的

<xs:element name="SomeElement" type="abc:SomeType"/> 

這裏就是我試圖重新定義<xs:complexType name="element">到所需要的「type」屬性的模式的一個例子。

<?xml version="1.0"?> 
<!-- edited with XMLSpy v2013 (http://www.altova.com) --> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:redefine schemaLocation="http://www.w3.org/2001/XMLSchema.xsd"> 
     <xs:complexType name="element" abstract="true"> 
      <xs:complexContent> 
       <xs:restriction base="xs:element"> 
        <xs:attribute name="type" use="required"> 
         <xs:simpleType> 
          <xs:restriction base="xs:QName"/> 
         </xs:simpleType> 
        </xs:attribute> 
       </xs:restriction> 
      </xs:complexContent> 
     </xs:complexType> 
     <xs:complexType name="topLevelElement"> 
      <xs:complexContent> 
       <xs:restriction base="xs:topLevelElement"/> 
      </xs:complexContent> 
     </xs:complexType> 
     <xs:complexType name="localElement"> 
      <xs:complexContent> 
       <xs:restriction base="xs:localElement"/> 
      </xs:complexContent> 
     </xs:complexType> 
     <xs:complexType name="narrowMaxMin"> 
      <xs:complexContent> 
       <xs:restriction base="xs:narrowMaxMin"/> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:redefine> 
    <xs:element name="SomeElement"/> 
</xs:schema> 

現在,有這種模式的一些有趣的方面,並在XMLSpy的2013(無Service Pack)的一些奇怪的行爲:

  1. 在 「文本」 的說法,並試圖保存,XMLSpy的顯示模式爲「無效」

  2. 在「綱要」的說法,並試圖保存,XMLSpy的顯示模式是有效的

  3. 嘗試到c在XMLSpy中創建示例XML文件將導致錯誤,指示該模式無效

  4. 模式中不應有效的唯一部分是<xs:element name="SomeElement">,因爲它尚未用「type」屬性定義。

  5. 發生的錯誤與重複聲明有關;但正在嘗試的是重新定義而不是另一個聲明。

問題:

  1. 是否有可能重新定義<xs:complexType name="element">要求 「類型」 屬性?
  2. 是否有可能在其他XSD中使用此重新定義的類型與不同的「targetNamespace」?

回答

0

由於「XSD」是由W3C控制的W3C XML模式語言,因此您無法重新定義其中的任何內容。 具體而言,您無法重新定義http://www.w3.org/2001/XMLSchema 名稱空間中定義的任何內容!

你怎麼樣?畢竟,無論你做什麼, 你總是需要從正常的<xs:schema>元素開始,該元素已經在該名稱空間中定義,'defined'意味着此處也已經定義了任何可能的<xs:schema>內容。 這裏不能有某種引導! 那將是一種不同的語言。 (雖然確實是一個奇怪的想法 - 寫下來併發送給W3C!)

那麼,你可以做的是定義你自己的XML模式語言(例如'XSDX')......但在不同的命名空間, ,是的,你可以基於標準的XSD。只需導入http://www.w3.org/2001/XMLSchema名稱空間並重用在此處定義的任何構造(即全局組件)。這種'XSDX'語言的使用是一個不同的故事......(我想,你必須開發某種新軟件來處理它)。

但是,我猜你的實際目標將驗證您的XML模式 是否符合一些輔助要求(例如關於該「類型」屬性)。

你可以通過開發某種額外的驗證器來實現這一點。

或者,您可以用代表擴展XML模式語言的URI替換(臨時)架構中的http://www.w3.org/2001/XMLSchema字符串。然後,任何標準軟件都會認爲它只是又一個XML,並且它會與任何驗證或其他任何驗證配合使用 。但是,仍然需要全面定義擴展的XML模式語言 - 以某種(普通)XML模式的形式。

相關問題