2008-10-07 82 views
7

我想爲這個xml塊創建XML Schema,我想限制「name」屬性的值,這樣在輸出文檔中每天只允許一天的一個實例:如何在XML Schema中定義具有相同名稱和不同屬性值的多個元素?

<a> 
    <day name="monday" /> 
    <day name="tuesday" /> 
    <day name="wednesday" /> 
</a> 

我曾嘗試使用此:

<xs:complexType name="a"> 
    <xs:sequence> 
    <xs:element name="day" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:attribute name="name" use="required"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="monday" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="day" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:attribute name="name" use="required"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="tuesday" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

但XML架構驗證在Eclipse中說錯誤「名爲‘天’的多個要素,不同類型,出現在模型組。」

有沒有其他辦法?

回答

12

你需要的東西是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="day"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="day"> 
    <xs:complexType> 
     <xs:attribute name="name" use="required"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="monday"/> 
       <xs:enumeration value="tuesday"/> 
       <xs:enumeration value="wednesday"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

何塞,這個伎倆,謝謝你的幫助。 – 2008-12-09 09:21:48

0

試試這個:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element maxOccurs="unbounded" name="day"> 
       <xs:complexType> 
        <xs:attribute name="atrib" type="xs:string" use="required" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

我認爲的maxOccurs = 「無界」 是你所需要的。

+0

我想限制屬性的值,我已經澄清了相應的問題。 – 2008-10-07 11:08:07

0

你有沒有考慮過這樣的事情? (即一天都是一個類型,元素一週的天而得名)

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="day" /> 
    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="monday" maxOccurs="1" minOccurs="0" type="day" /> 
     <xs:element name="tuesday" maxOccurs="1" minOccurs="0" type="day" /> 
     <xs:element name="wednesday" maxOccurs="1" minOccurs="0" type="day" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

是的,我做了,實際上我現在正好使用這個,但被質疑的XML設計在我看來更合適。不管怎麼說,還是要謝謝你。 – 2008-10-07 12:20:01

0

使用的選擇,而不是序列

到那個方式你可以只有一天元素之一在一個元素

而對於名稱屬性使用參考屬性和參考它與枚舉

7

爲了滿足原始問題中描述的至多一次約束,您需要在模式中使用xs:unique元素。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 

    <xs:element name="a"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="day" maxOccurs="7" minOccurs="1"> 
      <xs:complexType> 
      <xs:attribute name="name" use="required"> 
       <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:pattern value="(mon|tues|wednes|thurs|fri|satur|sun)day"/> 
       </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
      </xs:complexType> 
      <xs:unique name="eachDayAtMostOnce"> 
      <xs:selector xpath="day"/> 
      <xs:field xpath="@name"/> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 
相關問題