2014-02-28 69 views
1

我希望創建一個XML文檔,其中的一個元素必須使用兩個已知屬性之一來定義,但不能同時使用這兩個屬性。XSD:A <xs:choice>等同於屬性

例如,我想定義一個「webAddress」元素如下:

<xs:element name="webAddress"> 
    <xs:complexType> 
     <xs:attribute name="hostName" type="xs:string"/> 
     <xs:attribute name="hostAddress" type="xs:string"/> 
    </xs:complexType> 
</xs:element> 

但我只希望用戶能夠定義一個主機名的屬性(例如,主機名=「)或一個hostAddress(例如,hostAddress =「」)屬性,但不能同時存在,看起來該構造完成了這個元素,是否有屬性的功能等價物,或者是否有更好的方法來處理這個屬性?

如果找到我們不能使用W3C XML Schema來做到這一點 我們可以使用嵌入式schematron規則,但是我們可以在選擇元素上做到這一點通過檢查元素和屬性在一起? 例如是這樣的:

<xs:choice> 
    <xs:element name="webAddress"> 
     <xs:complexType> 
      <xs:attribute name="hostName" type="xs:string"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="webAddress"> 
     <xs:complexType> 
      <xs:attribute name="hostAddress" type="xs:string"/> 
     </xs:complexType> 
    </xs:element> 
    </xs:choice> 
+0

進一步你可以使屬性爲強制使用=「required」 – Naren

+0

這不完全是我想看到的。 'hostName'和'hostAddress'應該具有相同的權利 – Nick

+0

相同的權利意味着? – Naren

回答

1

你可以使用「類型」替代,例如

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <!-- Some abstract type - it might define some common parts too. It is abstract and cannot be used directly for instance --> 
    <xs:complexType name="abstractType" abstract="true"/> 

    <!-- First "children" type of abstract type--> 
    <xs:complexType name="hostNameType"> 
     <xs:complexContent> 
      <!-- it is derived from abstractType and adds attribute hostName --> 
      <xs:extension base="abstractType"> 
       <xs:attribute name="hostName" type="xs:string" use="required" /> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <!-- Second "children" type of abstract type --> 
    <xs:complexType name="hostAddressType"> 
     <xs:complexContent> 
      <!-- it is also derived from abstractType and adds attribute hostAddress --> 
      <xs:extension base="abstractType"> 
       <xs:attribute name="hostAddress" type="xs:string" use="required" /> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <!-- Element of abstractType --> 
    <xs:element name="webAddress" type="abstractType" /> 

</xs:schema> 

在實例文檔中,你必須指定其實際使用類型:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- by xsi:type you defined which "concrete" type is really used --> 
<webAddress xsi:type="hostNameType" hostName="String" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 

<?xml version="1.0" encoding="UTF-8"?> 
<webAddress xsi:type="hostAddressType" hostAddress="xxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 

但定義是一個有點冗長,而且不是很明顯的第一眼看什麼類型的「網絡地址」真的可以。但它可能是你的一種方式。

+0

謝謝,我認爲這是我們能做的最好的。 – Nick

0

使用斷言或條件類型賦值很容易在XSD 1.1中實現所需內容,但在XSD 1.0中無法實現。

XSD 1.1目前由Saxon,Xerces和Altova支持。