2013-05-10 59 views
2

這裏是我的XSD的<schema>標籤:targetNamespace做什麼?我是否正確?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.cmu.edu/ns/blank" 
    targetNamespace="http://www.cmu.edu/ns/blank" 
    elementFormDefault="qualified"> 

如果我的理解是正確的,在這裏的意思是這樣:

  • 該模式本身屬於http://www.w3.org/2001/XMLSchema命名空間
  • XML實例的根應該屬於http://www.cmu.edu/ns/blank命名空間
  • XML實例中沒有前綴的所有元素都會自動屬於http://www.cmu.edu/ns/blank命名空間,因爲elementFormDefault合格的
  • 問題1:我的理解是否正確。如果不是,那有什麼問題?

    問題2看看下述的XML實例:屬於http://www.cmu.edu/ns/blank命名空間,包括<student>和包含因elementFormDefault中的元素

    <people 
    xmlns="http://www.cmu.edu/ns/blank" 
    xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.cmu.edu/ns/blank student.xsd" 
    > 
        <student> 
         <name>John</name> 
         <course>Computer Technology</course> 
         <semester>6</semester> 
         <scheme>E</scheme> 
        </student> 
    </people> 
    

    這裏一切。 正確嗎?

    問題3
    現在,我想從各個大學加入<student>。前綴如Berkley的berk,哈佛的harv等。每個<student>都有一組不同的元素。我想驗證一下。 這怎麼可能?

    +1

    Q3對於XML命名空間聽起來並不合適。這就像在編程語言類型系統中定義一個'BerkStudent'類和'HarvStudent'類。 – McDowell 2013-05-10 12:46:33

    +0

    @McDowell是的,你是對的,但是我可以在XSD中爲Berkley和Harvard使用''並添加更多字段。這就像泛化/專業化關係:) – 2013-05-10 12:59:32

    +0

    你正在考慮向後 - 模式不會「自動引起」實例文檔中的任何事情,這取決於你在默認名稱空間和前綴聲明中使用正確的組合使實例文檔與模式所期望的內容相匹配。 'elementFormDefault'是影響這些_expectations_的事情之一。 – 2013-05-10 18:22:28

    回答

    4

    (1)前兩點都OK;第三個:

    All the elements within the XML instance which do not have a prefix automatically belong to http://www.cmu.edu/ns/blank namespace as elementFormDefault is qualified

    不正確。

    在架構中聲明前綴並不意味着XML實例必須使用相同的前綴。 XSD文件中的任何名稱空間聲明僅適用於XSD的XML文件(因此XSD是XML,因此...)

    通常,無法假定任何有前綴或無前綴元素名稱;即以下例子都是正確的。

    <some xmlns="" .../> 
    <some xmlns="urn:tempuri-org:XSD:1" .../> 
    <x:some xmlns:x="urn:tempuri-org:XSD:1" .../> 
    

    唯一肯定的是,表示不合格的名稱的唯一方法是通過一個名不經前綴(即一個人不能前綴「空」的命名空間)。

    elementFormDefault控制元素名稱的形式,當一個元素在內容模型中聲明時(即不是全局的)。

    (2)部分正確。部分because of elementFormDefault.不正確。同樣,XSD只是一個模式規範; XML存在並且有其自己的規則,與XSD或任何其他模式語言無關。這裏適用的規則是XML namespaces的規則,特別是scoping

    (3)您將不得不爲每個名稱空間創建一個XSD;在每個名稱空間內,您聲明瞭學生及其內容。然後,定義人的XSD將適當地導入其他XSD和參考學生。

    所以這是一個基本的設置:

    Berkeley.xsd

    <?xml version="1.0" encoding="utf-8" ?> 
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
    <xsd:schema targetNamespace="urn:berkeley-org" xmlns="urn:berkeley-org" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
        <xsd:element name="student"/> 
    </xsd:schema> 
    

    Harvard.xsd

    <?xml version="1.0" encoding="utf-8" ?> 
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
    <xsd:schema targetNamespace="urn:harvard-org" xmlns="urn:harvard-org" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
        <xsd:element name="student"/> 
    </xsd:schema> 
    

    people.xsd

    <?xml version="1.0" encoding="utf-8" ?> 
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
    <xsd:schema targetNamespace="urn:people-org" xmlns="urn:people-org" xmlns:harv="urn:harvard-org" xmlns:berk="urn:berkeley-org" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
        <xsd:import namespace="urn:harvard-org" schemaLocation="harvard.xsd"/> 
        <xsd:import namespace="urn:berkeley-org" schemaLocation="berkeley.xsd"/> 
    
        <xsd:element name="people"> 
         <xsd:complexType> 
          <xsd:choice maxOccurs="unbounded"> 
           <xsd:element ref="harv:student"/> 
           <xsd:element ref="berk:student"/>    
          </xsd:choice> 
         </xsd:complexType> 
        </xsd:element> 
    </xsd:schema> 
    

    的文件圖表:

    enter image description here

    一個示例XML(顯示命名空間的使用):

    <?xml version="1.0" encoding="utf-8" standalone="yes"?> 
    <!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
    <people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:harv="urn:harvard-org" xmlns:berk="urn:berkeley-org" xmlns="urn:people-org"> 
        <harv:student/> 
        <berk:student/> 
    </people> 
    

    enter image description here

    +0

    我在'elementFormDefault'這裏讀了一些:http://www.levijackson.net/elementformqualified-what-is-it/並解決了這個神話我。綜上所述:'elementFormDefault =「qualified」 - 所有元素都屬於targetNameSpace。如果*不合格*它們不屬於任何地方,除非聲明瞭「空白」名稱空間。推斷來自網站 – 2013-05-11 07:05:44

    +0

    @LittleChild沒有「除非」 - xmlns聲明不會進入它。在complexType中聲明的'elementFormDefault =「限定的'本地元素進入模式的targetNamespace,並且沒有限定,它們不在命名空間中(即只有全局頂層元素聲明會佔用目標命名空間)。 – 2013-05-13 22:53:40

    +1

    @LittleChild/@IanRoberts:嚴格來說,這裏要記住的關鍵是「默認」,即elementForm默認提供了一個默認的(初始化),當form屬性不使用。換句話說,不管默認情況如何,表單屬性優先。因此,即使在這裏,還有一個'unless':即'With elementFormDefault =「限定的」在complexType中聲明的局部元素進入模式的targetNamespace,除非form屬性另有說明。 – 2013-05-13 23:18:30

    1

    Petru's answer是一個很好的,但它要求基地 「人」 的模式要注意(並導入)所有不同的學院特定模式 - 如果你想添加一個新的大學,你必須更新基礎模式來匹配。一種不同的方法是通過讓基礎模式聲明基礎「學生」類型來顛倒進口的方向,可能使用所有大學通用的元素,其他模式使用substitution group機制擴展。

    people.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="urn:people" 
        xmlns:p="urn:people" 
        elementFormDefault="unqualified"> 
    
        <xs:element name="people"> 
        <xs:complexType> 
         <xs:sequence> 
         <xs:element ref="p:student" minOccurs="0" maxOccurs="unbounded" /> 
         </xs:sequence> 
        </xs:complexType> 
        </xs:element> 
    
        <xs:complexType name="studentType"> 
        <xs:sequence> 
         <xs:element name="name" type="xs:string" /> 
        </xs:sequence> 
        </xs:complexType> 
    
        <xs:element name="student" type="p:studentType" /> 
    </xs:schema> 
    

    harvard.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="urn:harvard" 
        xmlns:p="urn:people" 
        elementFormDefault="unqualified"> 
        <xs:import namespace="urn:people" schemaLocation="people.xsd"/> 
    
        <xs:element name="student" substitutionGroup="p:student"> 
        <xs:complexType> 
         <xs:extension base="p:studentType"> 
         <xs:element name="harvardId" type="xs:string" /> 
         </xs:extension> 
        </xs:complexType> 
        </xs:element> 
    </xs:schema> 
    

    berkeley.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="urn:berkeley" 
        xmlns:p="urn:people" 
        elementFormDefault="unqualified"> 
        <xs:import namespace="urn:people" schemaLocation="people.xsd"/> 
    
        <xs:element name="student" substitutionGroup="p:student"> 
        <xs:complexType> 
         <xs:extension base="p:studentType"> 
         <xs:element name="berkeleyId" type="xs:string" /> 
         </xs:extension> 
        </xs:complexType> 
        </xs:element> 
    </xs:schema> 
    

    實例文檔

    <p:people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:harv="urn:harvard" xmlns:berk="urn:berkeley" xmlns:p="urn:people" 
          xsi:schemaLocation="urn:people people.xsd urn:harvard harvard.xsd 
               urn:berkeley berkely.xsd> 
        <harv:student> 
        <name>John</name> 
        <harvardId>12345</harvardId> 
        </harv:student> 
        <berk:student> 
        <name>Mary</name> 
        <berkeleyId>ABCDE</berkeleyId> 
        </berk:student> 
    </p:people> 
    

    請注意,我用elementFormDefault="unqualified"在這個例子中,以簡化在實例文檔的命名空間。如果我用qualified那麼你不得不說,像

    <harv:student> 
        <p:name>John</p:name> 
        <harv:harvardId>12345</harv:harvardId> 
    </harv:student> 
    

    (即從基繼承的harv:student下的元素p:studentType將不得不在urn:people命名空間,但那些在harvard.xsd擴展聲明必須位於urn:harvard名稱空間中)。

    的關鍵點,瞭解這裏是:

    • people架構聲明瞭一個全球複雜類型studentType全球元素student這種類型的,並聲明people元素的{urn:people}student序列。
    • 每個學院特定的架構聲明自己的元素substitutionGroup="p:student"和延伸p:studentType的類型。這告訴確認者,在任何地方預計有{urn:people}student{urn:college}student也是可以接受的。
    • 當你想添加一個新的大學時,你只需在同一個substitutionGroup中創建一個新元素的類似模式,你可以參考實例文檔中的內容 - 不需要更改people模式。
    +0

    也不錯,我在這裏沒有提到的原因,但我把它在許多其他的答案,例如[這裏](http://stackoverflow.com/questions/9008622/how-to-extend-a-choice-complextype-without-sequencing-the-choice/9008966#9008966)是替代組是一個更先進的概念爲初學者處理,再加上它在各種實現中並沒有得到廣泛和/或同等的支持。所以如果我可能會建議,現在你已經開始了它:如果替換組的頭部被標記爲抽象,則可以實現最大互操作;你不需要爲學生定義基本類型... – 2013-05-13 23:06:33

    +0

    (續)...除非你想要一個共同的抽象;最好的做法是將可重用組件(學生及其類型)的定義與其使用(這裏是人)分開。所以最終的設置(我稱之爲生產級別)是讓人們的模式引用一個學生模式,然後由另外兩個人蔘考。 – 2013-05-13 23:07:44

    相關問題