XML Schema:如何声明具有相同名称的属性或子项的complexType

时间:2013-02-09 09:04:40

标签: xml xsd

使用我的XSD架构,我希望元素具有必需的附加值,可以在元素的属性或子元素中指定。

示例:应允许以下元素:

<flower color="red" />

或:

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

但以下元素不应有效:

<flower />

<flower></flower>

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

我完全不知道如何做到这一点。

2 个答案:

答案 0 :(得分:2)

在XSD 1.0中,您唯一的选择是记录散文中的约束。 (例如,在模式的模式中,对元素声明具有类似的约束。)

在XSD 1.1中,您可以使用断言来记录和强制执行约束。修改了Petru 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>

鉴于刚刚显示的架构文档和以下实例,Saxon拒绝第一个和第四个花元素无效。

<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>

(那就是说,我的直觉是建议不要把这个设计变得不必要的复杂:选择让颜色成为一个属性,或选择让它成为一个孩子。事实上,每个都是合理的设计意味着允许它在文档中变化是一种似是而非的设计。)

答案 1 :(得分: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>