欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用W3C XML Schema
使用W3C XML Schema
Author: 姜曉東

 
W3C XML Schema 定義語(yǔ)言是描述和約束XML文檔內容的XML語(yǔ)言,W3C推薦使用W3C XML Schema。

本文介紹了如何使用W3C XML Schema,還包括了對Schema數據類(lèi)型和結構的完整參考。

第一個(gè)Schema

讓我們從一個(gè)描述一本書(shū)的簡(jiǎn)單文檔開(kāi)始:

<?xml version="1.0" encoding="UTF-8"?>
<book isbn="0836217462">
 
<title>
  Being a Dog Is a Full-Time Job
 
</title>
 
<author>Charles M. Schulz</author>
 
<character>
  
<name>Snoopy</name>
  
<friend-of>Peppermint Patty</friend-of>
  
<since>1950-10-04</since>
  
<qualification>
    extroverted beagle
  
</qualification>
 
</character>
 
<character>
  
<name>Peppermint Patty</name>
  
<since>1966-08-22</since>
  
<qualification>bold, brash and tomboyish</qualification>
 
</character>
</book>

要為這份文檔寫(xiě)一份scheme,可以從它的結構和定義我們看到的每個(gè)元素開(kāi)始,我們現在從xs:schema元素開(kāi)始:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
.../... 
</xs:schema> 

定義從schema 元素開(kāi)始,它也包括了目標名稱(chēng)空間的定義和幾個(gè)默認選項,我們會(huì )在下面章節中看到它們。

為了匹配book 元素標簽,我們定義一個(gè)叫做book的元素。這個(gè)元素具有屬性而無(wú)文字子節點(diǎn),因此我們認為它是一個(gè)complexType (因為另一個(gè)數據類(lèi)型simpleType 是只包括數據值而沒(méi)有子節點(diǎn)或者屬性),book元素的子節點(diǎn)使用sequence 元素進(jìn)行定義:

<xs:element name="book">
  
<xs:complexType>
    
<xs:sequence>
     .../...
    
</xs:sequence>
    .../...
  
</xs:complexType>
</xs:element>

sequence 定義了順序的子元素,接下來(lái)的章節還會(huì )探討另外兩個(gè)同樣的元素:choice和all。

現在,我們來(lái)定義title和author元素為簡(jiǎn)單類(lèi)型——因為它們沒(méi)有包含屬性和非文本元素,并且可以在一個(gè)退化的元素element 內部直接描述。類(lèi)型(xs:string)是被預先加了XML scheme相關(guān)的名稱(chēng)空間前綴,表示為預定義的XML scheme數據類(lèi)型:

<xs:element name="title" type="xs:string"/> 
<xs:element name="author" type="xs:string"/> 

現在,我們必須來(lái)處理character 元素了,它是一個(gè)復雜類(lèi)型,注意它的基數(cardinality )是如何定義的:

<xs:element name="character" minOccurs="0" maxOccurs="unbounded"> 
<xs:complexType> 
<xs:sequence> 
.../... 
</xs:sequence> 
</xs:complexType> 
</xs:element>

不像其他的scheme定義語(yǔ)言,W3C XML Schema  允許我們定義一個(gè)元素的精密基數(例如:可能的數目),我們可以一起指定minOccurs(最小可能)和maxOccurs (最大可能),這里maxOccurs 設置為unbounded 意思是該節點(diǎn)無(wú)最大數目限制,可以任意多。 

我們使用同樣的方式指定所有的子節點(diǎn):

<xs:element name="name" type="xs:string"/> 
<xs:element name="friend-of" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
<xs:element name="since" type="xs:date"/> 
<xs:element name="qualification" type="xs:string"/>

我們現在可以聲明元素的屬性了,一般在最后這樣做。似乎并沒(méi)有什么特別的理由這樣做,但是W3C XML Schema工作組已經(jīng)認為在一種復雜的類(lèi)型內把一項有關(guān)的命令強加到元素列表和屬性的定義更簡(jiǎn)單,并且在元素之后定義屬性是更自然的。

<xs:attribute name="isbn" type="xs:string"/> 

就是這樣!第一次的設計,有時(shí)也被稱(chēng)為“俄羅斯玩偶設計”,緊隨我們示例文檔的結構。

其中這樣的設計的一個(gè)關(guān)鍵特點(diǎn)是定義一個(gè)上下文中的每個(gè)元素和屬性,并允許多個(gè)事件的同一元素的名稱(chēng),進(jìn)行不同的定義。

本例的完整scheme定義如下:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="book"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="title" type="xs:string"/> 
<xs:element name="author" type="xs:string"/> 
<xs:element name="character" minOccurs="0" maxOccurs="unbounded"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="name" type="xs:string"/> 
<xs:element name="friend-of" type="xs:string" minOccurs="0" 
maxOccurs
="unbounded"/> 
<xs:element name="since" type="xs:date"/> 
<xs:element name="qualification" type="xs:string"/> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:sequence> 
<xs:attribute name="isbn" type="xs:string"/> 
</xs:complexType> 
</xs:element> 
</xs:schema>
下面的章節探討了如何細分模式設計,以使它們更具可讀性和可維護性。
 

分層 Schema

因為以往的設計方法很簡(jiǎn)單,它會(huì )導致內嵌設計變得深奧,使之難以可讀并且當文件復雜的時(shí)候難以維護。另外一個(gè)不利的地方是,XML和DTD在結構上差別很大,給人和機器在想將DTD轉換到XML Scheme的時(shí)候造成了很大的麻煩,甚至在兩種技術(shù)上無(wú)法使用同一個(gè)設計指導。

第二種設計基于一個(gè)所有在實(shí)例文檔中可用元素的目錄,包括其中的每個(gè)元素,例如子元素和屬性的列表。這種作用是通過(guò)使用元素參考和必須符合范圍的參考的屬性定義,實(shí)現了簡(jiǎn)單設計:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<!-- definition of simple type elements --> 
<xs:element name="title" type="xs:string"/> 
<xs:element name="author" type="xs:string"/> 
<xs:element name="name" type="xs:string"/> 
<xs:element name="friend-of" type="xs:string"/> 
<xs:element name="since" type="xs:date"/> 
<xs:element name="qualification" type="xs:string"/> 
<!-- definition of attributes --> 
<xs:attribute name="isbn" type="xs:string"/> 
<!-- definition of complex type elements --> 
<xs:element name="character"> 
<xs:complexType> 
<xs:sequence> 
<xs:element ref="name"/> 
<xs:element ref="friend-of" minOccurs="0" maxOccurs="unbounded"/> 
<xs:element ref="since"/> 
<xs:element ref="qualification"/> 
<!-- the simple type elements are referenced using 
the "ref" attribute 
--> 
<!-- the definition of the cardinality is done 
when the elements are referenced 
--> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
<xs:element name="book"> 
<xs:complexType> 
<xs:sequence> 
<xs:element ref="title"/> 
<xs:element ref="author"/> 
<xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/> 
</xs:sequence> 
<xs:attribute ref="isbn"/> 
</xs:complexType> 
</xs:element> 
</xs:schema>

使用元素或屬性的引用某種程度上好克隆一個(gè)對象相似。元素或者屬性首先被定義,然后在該文檔的其他地方可以通過(guò)引用機制被復制,同樣對象也可以被克隆。這兩個(gè)元素(或屬性)那么就是同一個(gè)類(lèi)的兩個(gè)實(shí)例。

下面的章節我們將講述怎樣定義“types”這種類(lèi),它允許我們復用元素定義。
 

定義命名類(lèi)型

我們已經(jīng)看到,當我們需要他們時(shí),我們可以定義元素和屬性,首先創(chuàng )建并引用它們(目錄)。 W3C XML Schema 給我們第3 個(gè)機制, 將確定數據類(lèi)型(用于PCDATA元素的簡(jiǎn)單類(lèi)型或者屬性或者僅用于元素的復雜類(lèi)型)使用這種類(lèi)型去定義我們的屬性和元素。

這是通過(guò)給simpleType 和complexType 元素命名實(shí)現的,并且在元素和屬性定義之外定位它們。我們也會(huì )借此機會(huì ),以顯示我們如何通過(guò)在數據類(lèi)型上定義約束新建一個(gè)數據類(lèi)型。

例如,要定義一個(gè)名為nameType的數據類(lèi)型,其為最大32個(gè)字符的字符串,我們會(huì )這樣寫(xiě):

<xs:simpleType name="nameType"> 
<xs:restriction base="xs:string"> 
<xs:maxLength value="32"/> 
</xs:restriction> 
</xs:simpleType> 

simpleType 元素中的name屬性值為新數據類(lèi)型的名稱(chēng)。restriction 元素表示通過(guò)應用一個(gè)約束,該數據類(lèi)型源自于W3C XML Schema 名稱(chēng)空間(基礎屬性)的數據類(lèi)型。例如,通過(guò)現在可能值的數字。這個(gè)maxLength 元素,即所謂的facet,說(shuō)明這個(gè)約束是一個(gè)最大長(cháng)度為32字符的約束條件。

另外一個(gè)功能強大的facet是pattern元素,它定義了一個(gè)必須匹配的正則表達式。例如,如果我們不關(guān)心“-”字符,我們可以定義ISBN數據類(lèi)型為10個(gè)數字,因此:

<xs:simpleType name="isbnType"> 
<xs:restriction base="xs:string"> 
<xs:pattern value="[0-9]{10}"/> 
</xs:restriction> 
</xs:simpleType>

Facets,以及另外兩種方式生成一個(gè)數據類(lèi)型(list和union)將在下面的章節介紹。

復雜類(lèi)型就像我們之前看到的那樣被定義,僅僅給一個(gè)名稱(chēng)。

定義并且使用命名的數據類(lèi)型與定義一個(gè)類(lèi)兵器使用它實(shí)例化一個(gè)對象相似。一種數據類(lèi)型是一個(gè)抽象的概念,可用于定義一個(gè)屬性或勻速。datatype和屬性以及元素的關(guān)系類(lèi)似于類(lèi)和對象的關(guān)系。

完整清單:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<!-- definition of simple types --> 
<xs:simpleType name="nameType"> 
<xs:restriction base="xs:string"> 
<xs:maxLength value="32"/> 
</xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="sinceType"> 
<xs:restriction base="xs:date"/> 
</xs:simpleType> 
<xs:simpleType name="descType"> 
<xs:restriction base="xs:string"/> 
</xs:simpleType> 
<xs:simpleType name="isbnType"> 
<xs:restriction base="xs:string"> 
<xs:pattern value="[0-9]{10}"/> 
</xs:restriction> 
</xs:simpleType> 
<!-- definition of complex types --> 
<xs:complexType name="characterType"> 
<xs:sequence> 
<xs:element name="name" type="nameType"/> 
<xs:element name="friend-of" type="nameType" minOccurs="0" 
maxOccurs
="unbounded"/> 
<xs:element name="since" type="sinceType"/> 
<xs:element name="qualification" type="descType"/> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="bookType"> 
<xs:sequence> 
<xs:element name="title" type="nameType"/> 
<xs:element name="author" type="nameType"/> 
<xs:element name="character" type="characterType" minOccurs="0"/> 
<!-- the definition of the "character" element is 
using the "characterType" complex type 
--> 
</xs:sequence> 
<xs:attribute name="isbn" type="isbnType" use="required"/> 
</xs:complexType> 
<!-- Reference to "bookType" to define the 
"book" element 
--> 
<xs:element name="book" type="bookType"/> 
</xs:schema> 
下面講的是分組、排序以及衍生如何用來(lái)實(shí)現進(jìn)一步的復用以及介紹scheme的結構。
 

分組,排序和派生

分組

W3C XML Schema 亦允許元素和屬性的分組定義。

<!-- definition of an element group --> 

<xs:group name="mainBookElements"> 
<xs:sequence> 
<xs:element name="title" type="nameType"/> 
<xs:element name="author" type="nameType"/> 
</xs:sequence> 
</xs:group> 

<!-- definition of an attribute group --> 
<xs:attributeGroup name="bookAttributes"> 
<xs:attribute name="isbn" type="isbnType" use="required"/> 
<xs:attribute name="available" type="xs:string"/> 
</xs:attributeGroup> 


這些分組可以被用于復雜類(lèi)型的定義,如下:

<xs:complexType name="bookType"> 
<xs:sequence> 
<xs:group ref="mainBookElements"/> 
<xs:element name="character" type="characterType" 
minOccurs
="0" maxOccurs="unbounded"/> 
</xs:sequence> 
<xs:attributeGroup ref="bookAttributes"/> 
</xs:complexType>

這些分組不是數據類(lèi)型,而是包含一組元素或屬性的容器,在整體復用上提供了方便。

排序(Compositors)

到目前為止,我們已經(jīng)看到了xs:sequence排序元素,它定義了有序的元素組。W3C XML Schema支持另外兩種排序元素, 它們可以被混合使用以支持各種組合形式。每個(gè)排序元素都擁有minOccurs 和maxOccurs 屬性,來(lái)定義它們的基數。

xs:choice表示幾種可能的元素中的一個(gè)選擇,或者多組元素中的一個(gè)選擇。以下的組——排序可以在組內出現、復雜類(lèi)型或者其他的排序,將會(huì )接受單一的name元素或者一系列的firstName、可選的middleName以及l(fā)astName:

<xs:group name="nameTypes">
    
<xs:choice>
      
<xs:element name="name" type="xs:string"/>
      
<xs:sequence>
        
<xs:element name="firstName" type="xs:string"/>
        
<xs:element name="middleName" type="xs:string" minOccurs="0"/>
        
<xs:element name="lastName" type="xs:string"/>
      
</xs:sequence>
    
</xs:choice>
  
</xs:group>


xs:all 定義了一組無(wú)序的元素。下面的復雜類(lèi)型定義允許其包含的元素以任意順序排列:

<xs:complexType name="bookType">
    
<xs:all>
      
<xs:element name="title" type="xs:string"/>
      
<xs:element name="author" type="xs:string"/>
      
<xs:element name="character" type="characterType" minOccurs="0"
       maxOccurs
="unbounded"/>
    
</xs:all>
    
<xs:attribute name="isbn" type="isbnType" use="required"/>
</xs:complexType>


為了避免組合變得復雜和模糊,而無(wú)法被W3C XML Schema工具所處理,一組約束被加到了xs:all:

  • 在內容模型上子節點(diǎn)必須唯一
  • 并且其子節點(diǎn)只能為xs:element定義或references,并且基數不能大于1

簡(jiǎn)單類(lèi)型的派生

簡(jiǎn)單的數據類(lèi)型都是派生于其他的數據類(lèi)型,要么是被W3C XML Schema 名稱(chēng)空間預定義或標識的,要么是在你自己的schema定義的。

我們之前看到了簡(jiǎn)單類(lèi)型使用約束派生的例子(使用xs:restriction 元素)??梢詰玫牟煌?lèi)別的約束稱(chēng)為切面(facet)。除了xs:pattern(使用正則表達式語(yǔ)法)和xs:maxLength這兩個(gè)切面看過(guò)外,許多切面允許在數據長(cháng)度、值列表、最小和最大值、精確和可變等上面進(jìn)行控制。

另外兩個(gè)派生方法已經(jīng)可用了,可以允許定義列表中分隔的空白和組合的數據類(lèi)型。下面的定義使用xs:union擴展了我們的isbn類(lèi)型,用了接受數據TDB和NA:

  <xs:simpleType name="isbnType">
    
<xs:union>
      
<xs:simpleType>
        
<xs:restriction base="xs:string">
          
<xs:pattern value="[0-9]{10}"/>
        
</xs:restriction>
      
</xs:simpleType>
      
<xs:simpleType>
        
<xs:restriction base="xs:NMTOKEN">
          
<xs:enumeration value="TBD"/>
          
<xs:enumeration value="NA"/>
        
</xs:restriction>
      
</xs:simpleType>
    
</xs:union>
  
</xs:simpleType>

union元素被應用到兩個(gè)內嵌的簡(jiǎn)單類(lèi)型上以允許兩個(gè)數據類(lèi)型的值數據,新類(lèi)型現在將接受來(lái)自于一個(gè)枚舉的兩個(gè)可能值(TBD和NA)。

下面的例子,類(lèi)型(isbnTypes)使用xs:list去定義一個(gè)ISBN數據的空白分隔的列表。它也是派生自一個(gè)類(lèi)型(isbnTypes10)使用xs:restriction接受1到10的數據值,以空白分隔。

 <xs:simpleType name="isbnTypes">
    
<xs:list itemType="isbnType"/>
  
</xs:simpleType>
  
<xs:simpleType name="isbnTypes10">
    
<xs:restriction base="isbnTypes">
      
<xs:minLength value="1"/>
      
<xs:maxLength value="10"/>
    
</xs:restriction>
  
</xs:simpleType>
 
 

內容類(lèi)型

在文章的第一部分,我們檢查了默認的內容類(lèi)型行為,在面向數據的文檔后建模,發(fā)現復雜類(lèi)型的元素只是元素和屬性,并且簡(jiǎn)單類(lèi)型的元素是沒(méi)有屬性的字符數據。

W3C XML Schema 定義語(yǔ)言也支持定義空白內容元素,以及具有屬性的簡(jiǎn)單內容(它們只包含字符串數據)。

空白內容元素使用xs:complexType結構并有意的忽略定義子元素。下列結構定義一個(gè)空白book元素并接受一個(gè)isbn屬性。

<xs:element name="book"> 
<xs:complexType> 
<xs:attribute name="isbn" type="isbnType"/> 
</xs:complexType> 
</xs:element> 

簡(jiǎn)單的內容元素,例如,具有屬性的字符串數據元素,可以使用xs:simpleContent從簡(jiǎn)單類(lèi)型派生。上面定義的book元素因此被擴展成可以接受一個(gè)文本數據:

<xs:element name="book"> 
<xs:complexType> 
<xs:simpleContent> 
<xs:extension base="xs:string"> 
<xs:attribute name="isbn" type="isbnType"/> 
</xs:extension> 
</xs:simpleContent> 
</xs:complexType> 
</xs:element> 

注意屬性定義的位置,顯示擴展點(diǎn)是通過(guò)擴展屬性完成的。這個(gè)定義將會(huì )接受下面的XML元素:

<book isbn="0836217462"> 
Funny book by Charles M. Schulz. 
Its title (Being a Dog Is a Full-Time Job) says it all ! 
</book>

W3C XML Schema在 xs:complexType 元素中通過(guò)混合屬性支持混合的內容??紤]下:

<xs:element name="book"> 
<xs:complexType mixed="true"> 
<xs:all> 
<xs:element name="title" type="xs:string"/> 
<xs:element name="author" type="xs:string"/> 
</xs:all> 
<xs:attribute name="isbn" type="xs:string"/> 
</xs:complexType> 
</xs:element> 

將驗證這樣的XML文件,如下:

<book isbn="0836217462"> 
Funny book by 
<author>Charles M. Schulz</author>
Its title (
<title>Being a Dog Is a Full-Time Job</title>) says it all ! 
</book> 
不像DTD那樣,W3C XML Schema 混合內容不修改子元素的約束,簡(jiǎn)單內容模型可以使用相同的方式表示。雖然這是較XML 1.0 DTD重要的改進(jìn),但注意字符數據值以及其相對子元素的位置,其不能應用約束。
 

約束

Unique

W3C XML Schema 提供了幾種靈活的基于XPath的特性,其描述了唯一性約束和一致性引用約束。首先,一個(gè)簡(jiǎn)單的唯一性聲明,使用xs:unique元素進(jìn)行聲明。下面的聲明建立在我們的book元素的名稱(chēng)必須唯一的前提下:

<xs:unique name="charName"> 
<xs:selector xpath="character"/> 
<xs:field xpath="name"/> 
</xs:unique> 

xs:unique 元素在schema中的位置,給出了內容節點(diǎn),其中包括了約束??吭赽ook元素插入xs:unique,我們指定了在全文中此book名稱(chēng)必須唯一。

唯一性約束中定義的兩個(gè)XPath 相對符合內容節點(diǎn)。第一個(gè)使用selector元素定義,目的是定義擁有該唯一性約束的元素——selector指向的節點(diǎn)必須是一個(gè)元素節點(diǎn)。

第二個(gè)路徑,在xs:field元素中定義的,是相對于xs:selector所標識的元素,其可以是一個(gè)元素或者一個(gè)屬性節點(diǎn)。這就是一個(gè)其值將會(huì )被檢查唯一性的節點(diǎn)。組合值可以通過(guò)在xs:unique中添加另外的xs:field元素來(lái)實(shí)現。

Key

第二個(gè)結構,xs:key,和xs:unique類(lèi)似,除了其值不能為null(注意xs:unique和xs:key都可以被引用)。要使用一個(gè)字符串名稱(chēng)作為一個(gè)key,我們可以通過(guò)使用xs:key替換xs:unique實(shí)現。

<xs:key name="charName"> 
<xs:selector xpath="character"/> 
<xs:field xpath="name"/> 
</xs:key> 

Keyref

第三個(gè)結構,xs:keyref,允許我們的那個(gè)有一個(gè)到xs:key或xs:unique的引用。要顯示它的用法,我們將介紹friend-of 元素,將會(huì )針對字符串使用。

<character> 
<name>Snoopy</name> 
<friend-of>Peppermint Patty</friend-of> 
<since>1950-10-04</since> 
<qualification> 
extroverted beagle 
</qualification> 
</character>

為了顯示friend-of需要從同一本書(shū)參考一個(gè)字符,我們將會(huì )寫(xiě),在同一個(gè)層次我們定義一個(gè)key約束,如下:

<xs:keyref name="charNameRef" refer="charName">
  
<xs:selector xpath="character"/>
  
<xs:field xpath="friend-of"/>
</xs:keyref>

 

這些功能基本獨立于schema中的其他特性。它們從數據類(lèi)型的定義中斷開(kāi)。唯一固定它們到schema的是它們被定義的位置,其中確定唯一性約束的范圍。
 

創(chuàng )建可用——并且可復用的Schema

或許編寫(xiě)可復用的schema的第一步是文檔化它們。W3C XML Schema 提供了一個(gè)XML注釋?zhuān)嫦蛉说模┑奶娲?,以及處理說(shuō)明(面向機器),可能為支持工具更易于處理。

人類(lèi)可讀的文檔可以用xs:documentation元素定義,而針對應用程序則必須包括在xs:appinfo元素內。它們都必須包含在xs:annotation元素內,并且接受可選的xml:lang以及source屬性和任意的內容類(lèi)型。source屬性是一個(gè)URI引用,可被用來(lái)說(shuō)明說(shuō)明注釋文檔的目的或應用程序信息。

xs:annotation元素可以被添加到大多數schema結構的開(kāi)始處,就如下面的例子那樣。appinfo部分演示了如何自定義名稱(chēng)空間和schema可能允許在schema內部一個(gè)元素綁定到一個(gè)Java類(lèi)。

<xs:element name="book"> 
<xs:annotation> 
<xs:documentation xml:lang="en"> 
Top level element. 
</xs:documentation> 
<xs:documentation xml:lang="fr"> 
Element racine. 
</xs:documentation> 
<xs:appinfo source="http://example.com/foo/"> 
<bind xmlns="http://example.com/bar/"> 
<class name="Book"/> 
</bind> 
</xs:appinfo> 
</xs:annotation>

從多個(gè)文件組合Schema

對那些希望將一個(gè)schema定義在多個(gè)文檔的人來(lái)說(shuō)——要么切分一個(gè)大的schema,要么使用schema代碼段的庫——W3C XML Schema 提供兩種機制來(lái)包含外部的schema。

第一種包含機制,xs:include類(lèi)似于復制并粘貼包含的schema的定義。它是一個(gè)包含文件并且它不允許覆蓋被包含schema的定義。它可以這樣使用:

<xs:include schemaLocation="character.xsd"/>

第二種包含機制,xs:redefine,類(lèi)似于xs:include,除了它會(huì )要求你從包含的schema中重新定義聲明。

<xs:redefine schemaLocation="character12.xsd"> 
<xs:simpleType name="nameType"> 
<xs:restriction base="xs:string"> 
<xs:maxLength value="40"/> 
</xs:restriction> 
</xs:simpleType> 
</xs:redefine> 

注意,被重定義的聲明必須放在xs:redefine元素中。

我們已經(jīng)看到了很多特性,它們可以被一起使用,通過(guò)xs:include和xs:redefine去創(chuàng )建schema的庫。我們看到了如何引用之前定義好的元素,如何通過(guò)派生定義數據類(lèi)型并使用它們,如何定義并使用屬性組,我們還看到元素好對象的對比、數據類(lèi)型和類(lèi)的對比。這里還有另外一個(gè)從面向對象設計借過(guò)來(lái)的特性,就是可以創(chuàng )建可復用的schema。

抽象類(lèi)型

這些特性中的第一個(gè),從面向對象設計演變而來(lái)的,是替代組。不像我們迄今看到的那些特性,一個(gè)替代組不是通過(guò)W3C XML Schema元素明確定義的,而是通過(guò)引用一個(gè)公用的元素(稱(chēng)為head)使用substitutionGroup。 

頭元素并不包含任何特定的聲明,但必須為全局的。所有的元素在一個(gè)替代組內需要有一個(gè)類(lèi)型,要么和頭元素同一個(gè)類(lèi)型或者可以從它派生。那么,他們都可以代替頭元素使用。在下面的例子中,surname元素可以在name元素被定義的任何地方使用。

<xs:element name="name" type="xs:string"/> 
<xs:element name="surname" type="xs:string" 
substitutionGroup
="name" /> 

現在,我們也可以定義一個(gè)一般的name-elt 元素,它為一個(gè)替代組的頭元素,其不應直接被使用,而應該使用其的一個(gè)派生形式。這是通過(guò)聲明該元素為抽象的實(shí)現的,類(lèi)似于面向對象語(yǔ)言中的一個(gè)抽象類(lèi)。下面的例子定義了name-elt為抽象元素,它應該被在引用的地方使用name或surname替代。

<xs:element name="name-elt" type="xs:string" abstract="true"/> 
<xs:element name="name" type="xs:string" 
substitutionGroup
="name-elt"/> 
<xs:element name="surname" type="xs:string" 
substitutionGroup
="name-elt"/>

最終類(lèi)型

我們可以,或者另一個(gè)方面,希望控制數據類(lèi)型上的派生。 W3C XML Schema 通過(guò)xs:complexType、xs:simpleType或者xs:element上的final屬性支持這點(diǎn)。這個(gè)屬性的值范圍為:restriction, extension 以及#al,通過(guò)約束現在擴展或派生。下面的片段代碼,舉例說(shuō)明,禁止從characterType 復雜類(lèi)型的任何派生。

<xs:complexType name="characterType" final="#all"> 
<xs:sequence> 
<xs:element name="name" type="nameType"/> 
<xs:element name="since" type="sinceType"/> 
<xs:element name="qualification" type="descType"/> 
</xs:sequence> 
</xs:complexType> 

除final外,一個(gè)更細粒度的機制是控制簡(jiǎn)單類(lèi)型的派生,作用在每個(gè)切面(facet)上。這里,這個(gè)屬性叫做fixed,當它的值設為true的時(shí)候,切面(facet)不能進(jìn)行修改(但其他的切換仍可被增加和修改)。下面的例子防止類(lèi)型nameType被重定義:

<xs:simpleType name="nameType"> 
<xs:restriction base="xs:string"> 
<xs:maxLength value="32" fixed="true"/> 
</xs:restriction> 
</xs:simpleType>  
 

名稱(chēng)空間

在W3C XML Schema里的Namespaces 支持是靈活而簡(jiǎn)單的。它不但允許在實(shí)例文檔(不像DTD)中使用任何前綴,而且允許你打開(kāi)Schemas從已知或未知命名空間接受未知的元素和屬性。

每個(gè)W3C XML Schema文檔都通過(guò)targetNamespace 屬性,綁定到一個(gè)特定的名稱(chēng)空間,或者缺少名稱(chēng)空間是因為缺少這樣一個(gè)屬性。每個(gè)我們想要定義的命名空間至少需要一個(gè)Schema文檔(元素和屬性沒(méi)有名稱(chēng)空間也可以被定義)。

截至目前,我們忽略了targetNamespace這個(gè)屬性,意思就是我們并沒(méi)有使用名稱(chēng)空間。 要涉足命名空間,先讓我們假設我們的例子屬于一個(gè)簡(jiǎn)單的名稱(chēng)空間:

<book isbn="0836217462" xmlns="http://example.org/ns/books/"> 
.../... 
</book> 

 

侵入性最小的方式,就是改寫(xiě)我們的schema,增加一些屬性到xs:schema元素:

<xs:schema targetNamespace="http://example.org/ns/books/" 
xmlns:xs
="http://www.w3.org/2001/XMLSchema" 
xmlns:bk
="http://example.org/ns/books/" 
elementFormDefault
="qualified" 
attributeFormDefault
="unqualified"> 
.../... 
</xs:schema>

名稱(chēng)空間的聲明扮演著(zhù)一個(gè)很重要的角色。首先(xmlns:xs=http://www.w3.org/2001/XMLSchema)說(shuō)明下,我們不但選擇使用前綴去標識元素以遵守W3C XML Schema的約定,而且我們在目前為止的所有例子中為W3C XML Schema預定義的數據類(lèi)型都加上了xs前綴。要知道我們可以選擇任何其他前綴代替xs。我們甚至可以在這個(gè)例子中使用http://www.w3.org/2001/XMLSchema 為我們默認的名稱(chēng)空間,我們本不會(huì )為W3C XML Schema元素或者數據類(lèi)型增加前綴的。

既然我們工作于http://example.org/ns/books/名稱(chēng)空間,我們就用它定義(使用bk做前綴)。這意味著(zhù)我們現在將要對引用加前綴使之成為“對象”(數據類(lèi)型、元素、屬性,……)屬于bk:名稱(chēng)空間。再者,我們本可以選擇任何的前綴來(lái)標識這個(gè)名稱(chēng)空間,或者甚至使用我們默認的名稱(chēng)空間(注意xs:unique, xs:key 以及xs:keyref中使用的 XPath表達式不使用默認名稱(chēng)空間)。

targetNamespace  屬性允許你定義獨立于名稱(chēng)空間的聲明,它的名稱(chēng)空間在本schema中描述。如果你需要引用這個(gè)名稱(chēng)空間的對象,這是個(gè)很常見(jiàn)的例子,除了targetNamespace之外你還需要提供一個(gè)名稱(chēng)空間聲明。

最后的兩個(gè)屬性(elementFormDefault 和attributeFormDefault)是在一個(gè)單一的schema中,W3C XML Schema提供的控制設施,無(wú)論屬性和元素被默認為是否合法的(在一個(gè)名稱(chēng)空間內)。合法和非法之間的區別可以通過(guò)指定默認值顯示,正如上面所述,而且當定義元素和屬性時(shí),加入一個(gè)form屬性,其值為qualified或unqualified。 

但必須注意的是只有本地元素和屬性可被指定為unqualified。所有全局定義的元素和屬性必須總是合法(qualified)。

從外部名稱(chēng)空間導入定義

W3C XML Schema不像XSLT和XPath,在一些屬性值中使用名稱(chēng)空間前綴來(lái)標識數據類(lèi)型、元素、屬性的名稱(chēng)空間。舉例來(lái)說(shuō),我們已經(jīng)在示例中通篇使用了這個(gè)特性來(lái)標識W3C XML Schema 的預定義數據類(lèi)型。這種機制可以被擴展以從任何其他的名稱(chēng)空間導入定義并在我們的schema中進(jìn)行復用。

通過(guò)三步流程可實(shí)現從其他名稱(chēng)空間復用定義。為了聲明xml:lang這樣的屬性,即使對于XML 1.0名稱(chēng)空間這個(gè)過(guò)程也需要這樣完成。首先,必須像往常一樣定義名稱(chēng)空間。

<xs:schema targetNamespace="http://example.org/ns/books/" 
xmlns:xml
="http://www.w3.org/XML/1998/namespace" 
xmlns:bk
="http://example.org/ns/books/" 
xmlns:xs
="http://www.w3.org/2001/XMLSchema" 
elementFormDefault
="qualified" 
attributeFormDefault
="qualified"> 
.../... 
</xs:schema> 

下一步,W3C XML Schema 需要知道符合該名稱(chēng)空間的schema所在位置??梢酝ㄟ^(guò)xs:import來(lái)實(shí)現。

<xs:import namespace="http://www.w3.org/XML/1998/namespace" 
schemaLocation
="myxml.xsd"/> 

W3C XML Schema現在知道它應該從myxml.xsd嘗試尋找任何屬于該XML名稱(chēng)空間的引用。我們現在就可以使用外部定義了。

<xs:element name="title"> 
<xs:complexType> 
<xs:simpleContent> 
<xs:extension base="xs:string"> 
<xs:attribute ref="xml:lang"/> 
</xs:extension> 
</xs:simpleContent> 
</xs:complexType> 
</xs:element> 

你可能感覺(jué)奇怪,為什么我們選擇從XML名稱(chēng)空間引用xml:lang屬性,而不是創(chuàng )建一個(gè)xml:lang,我們這樣做是因為,引用一個(gè)屬性(或元素)和引用一個(gè)數據類(lèi)型在關(guān)系到名稱(chēng)空間時(shí)存在重大區別。

  • 引用一個(gè)元素或屬性導入了全部?jì)热莅Q(chēng)和名稱(chēng)空間。
  • 引用一個(gè)數據類(lèi)型僅僅導入其定義,而為你正定義的元素和屬性命名,以及使用目標名稱(chēng)空間(如果你的屬性或元素為unqualified的話(huà)則沒(méi)有名稱(chēng)空間)的事都要留給你自己去做。

包含未知的元素

要完成這個(gè)關(guān)于名稱(chēng)空間的部分,我們需要知道我們的schema如何對未知元素開(kāi)發(fā),沮洳在介紹中約定的那樣。這個(gè)特性是通過(guò)xs:any 和xs:anyAttribute來(lái)完成的,它允許分別的包含元素或屬性。

舉例來(lái)說(shuō),如果我們希望擴展我們的描述類(lèi)型為任意的XHTML標簽,我們可以這樣聲明:

<xs:complexType name="descType" mixed="true"> 
<xs:sequence> 
<xs:any namespace="http://www.w3.org/1999/xhtml" 
processContents
="skip" minOccurs="0" 
maxOccurs
="unbounded"/> 
</xs:sequence> 
</xs:complexType> 

xs:anyAttribute 給予了屬性相同的功能。

descType 類(lèi)型現在和內容混合了,并且接受一個(gè)任意數字或http://www.w3.org/1999/xhtml 名稱(chēng)空間中的任何元素。processContents 屬性設為了skip表示告知W3C XML Schema 處理器不進(jìn)行校驗那些本該嘗試校驗的元素。其他可能的值為,strict 要求校驗這些元素,或者lax要求需要時(shí)才進(jìn)行校驗。namespace 屬性接受一個(gè)空格分隔的URI列表,并且特殊的值##local(非合格元素)和##targetNamespace(目標名稱(chēng)空間) 可以包含在該列表中,##other(除了目標以外的其他名稱(chēng)空間)##any (任何名稱(chēng)空間)則可以替代這個(gè)URI列表。除了這些提到的值以外不需要任何其他值。
 

W3C XML Schema和實(shí)例文檔

我們目前已經(jīng)涵蓋了幾乎所有的W3C XML Schema的特性,但我們仍需要看一看一些在你的實(shí)際工作中可以使用的擴展。為了區別這些另外的特性,一個(gè)單獨的名稱(chēng)空間 http://www.w3.org/2001/XMLSchema-instance,通常使用前綴xsi。

xsi:noNamespaceSchemaLocation 和xsi:schemaLocation屬性允許你將文檔綁定到它的W3C XML Schema上面。連接并不是強制的,并且在合法性校驗時(shí)亦會(huì )給出其他的建議,但是這確實(shí)有助于W3C XML Schema工具定位一個(gè)schema所在位置。

依賴(lài)于使用名稱(chēng)空間,連接可能是:

<book isbn="0836217462"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation
="file:library.xsd">

或者,類(lèi)似下面這樣(注意具有URL的名稱(chēng)空間的語(yǔ)法以及schema中的URL,在相同的屬性中使用空格分隔):

<book isbn="0836217462" 
xmlns
="http://example.org/ns/books/" 
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation

"http://example.org/ns/books/ file:library.xsd"
> 

其他關(guān)于xsi 屬性的用法是提供如何將一個(gè)元素對應到一個(gè)schema的信息。這些屬性為xsi:type,它允許你定義元素的簡(jiǎn)單或復雜類(lèi)型;以及xsi:nil,允許將nil(null)值賦給一個(gè)元素(前提是必須在schema中使用nillable=true屬性)。在你的W3C XML Schema中你不需要聲明這些屬性就可以使用它們。

 

本文譯自:http://www.xml.com/pub/a/2000/11/29/schemas/part1.html?page=1

譯者:姜曉東(http:
//blog.csdn.net/abigfrog/

聯(lián)系:QQ:
800736  MSN: j2ee@hotmail.
com

翻譯開(kāi)始結束時(shí)間:
2008-3-30 ~ 2008-4-1


轉帖請注明出處及本信息??!謝謝合作??!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
XMLSchema 詳解
XML Schema使用技巧
XML技術(shù)庫--->Schema Structure小結
Java程序員從笨鳥(niǎo)到菜鳥(niǎo)之(二十五)XML之Schema驗證
XML開(kāi)發(fā)筆記 — 總結
理解XML Schema: XML Schema初步(II)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久