2011-10-07 143 views
9

我想要聲明一個要包含在複雜類型聲明中的元素,並且該元素具有強制屬性:「option = MyOption」,,但「option」屬性可以是任何東西,這取決於上下文。XSD架構中的元素強制屬性聲明:

即:在使用包含此元素的複雜類型的任何文檔中,具有某個未知值的屬性「選項」應爲強制性的。

實施例:

<xs:element name="SpecialOption" type="xs:string"/> 

    <xs:complexType name="SpecialOptions"> 
     <xs:sequence> 
      <xs:element ref="SpecialOption" minOccurs="1" maxOccurs="100"/> 
      <xs:element ref="XXX"/>  
     </xs:sequence> 
    </xs:complexType> 

在這種情況下,在複雜的類型「SpecialOptions」該「SpecialOption」元件應該有這樣的強制屬性。

我不知道如何聲明XSD中元素的強制屬性,或者如何指定該屬性必須具有尚未知的值。

回答

23

您需要修改「SpecialOption」元素的定義以包含必需的屬性。更新此代碼:

<xs:element name="SpecialOption" type="xs:string"/> 

這樣:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute name="Option" type="xs:string" use="required"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

有了這個改變你的複雜類型將包含所需的「選項」的「SpecialOption」元素的所有實例「SpecialOptions」屬性複雜類型。聲明「Option」屬性的類型爲xs:string將允許在該字段中傳遞任何值。

+0

聽起來不錯 - 這是我需要知道的:如何使屬性成爲元素的必需組件。 「聲明」Option「屬性的類型爲xs:string將允許在該字段中傳遞任何值。」理解 - 但我可以通過聲明一個枚舉類型並根據我的需求進行擴展來更好地服務。將嘗試你的代碼 - 如果它的工作,你有獎金。 – Vector

3

要標記屬性爲必填項,請使用<xs:attribute use="required" />

至於類型,您可以選擇內置的XSD類型(xs:string等),或者您可以定義自己的<xs:simpleType />並使用它。

UPDATE

我不能肯定你被意思的屬性必須有一個還不知道的值。這是否意味着該值是一個字符串,但可以是任何字符串?還是小數?

因爲它是我們談論的屬性值,所以僅限於使用內置的XSD類型,或者基於其中一種內置類型定義您自己的xs:simpleType類型。您可以在此處將更嚴格的規則應用於允許的值,例如,通過擴展xs:string並向允許的值添加正則表達式約束。

<xsd:simpleType name="UKDate"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:pattern value="(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d"/> 
    </xsd:restriction> 
</xsd:simpleType> 

但是,如果是絕對無法知道將使用什麼樣的價值,那麼你必須熟知時間悖論,讓你不能限制在設計時的東西,你只知道在運行時的值的方式。在這種情況下,當然只需要指定該屬性必須至少存在?

<xs:attribute use="required" />

希望這一點更清晰地回答你的問題。

+0

不太清楚 - 你沒有解釋如何聲明一個包含強制屬性的元素。 – Vector

15

1)這是一個簡單的所需字符串屬性

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" type="xs:string" use="required"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

2)如果要求精確地允許值的列表中的一個:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="DE"/> 
          <xs:enumeration value="EN"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

3)一個可使用的範圍內,爲限制,如下面的例子。

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:restriction base="xs:integer"> 
          <xs:minInclusive value="95"/> 
          <xs:maxInclusive value="137"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

4)下面,屬性被聲明爲包含十進制值的列表。這允許屬性包含指定值的子集,例如,選項=「6 77 95」。

<xs:simpleType name="Items"> 
    <xs:restriction base="xs:decimal"> 
     <xs:enumeration value="137"/> 
     <xs:enumeration value="95"/> 
     <xs:enumeration value="6"/> 
     <xs:enumeration value="77"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" use="required"> 
        <xs:simpleType> 
         <xs:list itemType="Items"/> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

5)這裏的屬性被聲明爲可選的,但提供了一個默認值(「測試」),這有時是不夠的:

<xs:element name="SpecialOption"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="Option" type="xs:string" use="optional" default="test"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
+0

+1 - 你的回答很詳細,內容非常豐富,但我給了獎勵回答2,因爲它已經足夠,並且比你早得多。 Tnx – Vector

+0

謝謝,時間已經過去了,我考慮了你的意見。不過,我明白答案2是足夠的,所以沒有問題:] – mousio

0

只要你能做到這一點,如下

<xs:element name="SpecialOption"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:whiteSpace value="replace"/> 
      <xs:minLength value="1"></xs:minLength> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

通過此代碼,您可以強制在xml標記上插入一個值,並且還會處理空白限制以從xml標記中刪除空白區域。