2013-02-09 75 views
2

使用我的XSD架構我希望元素具有可以在元素屬性或其子元素中指定的必需附加值。XML架構:如何聲明具有屬性或具有相同名稱的子元素的complexType

實施例:下列元素應該被允許:

<flower color="red" /> 

或:

<flower><color>red</color></flower> 

但以下元素不應該是有效的:

<flower /> 

和:

​​

和:

<flower color="red"><color>blue</color></flower> 

而且我也絕對不知道如何做到這一點。

回答

1

假設XSD 1.0,下面的示例是一個起點:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:simpleType name="flowerColor"> 
     <xsd:restriction base="xsd:normalizedString"> 
      <xsd:minLength value="1"/> 
     </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:complexType name="flowerVariantA"> 
     <xsd:attribute name="color" type="flowerColor" use="required"/> 
    </xsd:complexType> 

    <xsd:complexType name="flowerVariantB"> 
     <xsd:sequence> 
      <xsd:element name="color" type="flowerColor"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:element name="flower" type="flowerVariantA"/> 
</xsd:schema> 

VariantA和B是相互排斥的,匹配的一個或另一個示例XML的。如果您的意圖是同時允許這兩種情況,那麼XSD 1.0不允許「選擇」將內容與元素混合的內容。

另外,您無法控制XML元素的自動關閉;這意味着,VariantA,以下是有效的:

<flower color="red"></flower> 
2

在XSD 1.0,你唯一的選擇是記錄在散文的約束。 (例如,在架構模式中,元素聲明具有類似的約束)。

在XSD 1.1中,您可以使用斷言來記錄和強制執行約束。 Modfying通過彼得魯杜米特Gardea提出了一個位架構文檔,我們有:

<xs:schema targetNamespace="http://example.com/colors" 
     xmlns:tns="http://example.com/colors" 
     elementFormDefault="qualified" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:simpleType name="flowerColor"> 
    <xs:restriction base="xs:normalizedString"> 
     <xs:minLength value="1"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="flowerVariantC"> 
    <xs:sequence> 
     <xs:element name="color" 
        type="tns:flowerColor" 
        minOccurs="0"/> 
    </xs:sequence> 
    <xs:attribute name="color" 
        type="tns:flowerColor" 
        use="optional"/> 
    <xs:assert test="(./tns:color or ./@color) 
     and not(./tns:color and ./@color)"/> 
    </xs:complexType> 

    <xs:element name="flower" type="tns:flowerVariantC"/>  
    <xs:element name="test"/> 

</xs:schema> 

鑑於剛剛展示的模式文檔和下面的實例,撒克遜人拒絕第一和第四花朵元素爲無效。

<test xmlns="http://example.com/colors" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://example.com/colors colors.xsd"> 
    <flower/> 
    <flower color="red"/> 
    <flower><color>blue</color></flower> 
    <flower color="blue"><color>blue</color></flower> 
</test> 

(這就是說,我的本能是反對這項建議設計過於複雜:選擇使顏色的屬性,還是選擇讓孩子的事實,每一個都是合理的設計確實。意味着允許它在文檔內變化是一種合理的設計。)

相關問題