2013-02-09 73 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> 

(这就是说,我的本能是反对这项建议设计过于复杂:选择使颜色的属性,还是选择让孩子的事实,每一个都是合理的设计确实。意味着允许它在文档内变化是一种合理的设计。)

相关问题