XML模式:如何声明具有相同名称的属性或子级的complexType

XML模式:如何声明具有相同名称的属性或子级的complexType,xml,xsd,Xml,Xsd,对于我的XSD模式,我希望元素具有所需的附加值,该值可以在元素的属性或其子元素中指定 示例:应允许以下元素: <flower color="red" /> 或: 红色 但以下要素不应有效: <flower /> 以及: 以及: 蓝色 我完全不知道如何做到这一点。假设XSD 1.0,下面的示例是一个起点: <?xml version="1.0" encoding="utf-8" ?> <!-- XML Schema generated

对于我的XSD模式,我希望元素具有所需的附加值,该值可以在元素的属性或其子元素中指定

示例:应允许以下元素:

<flower color="red" />

或:

红色
但以下要素不应有效:

<flower />

以及:


以及:

蓝色

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

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

Variata和B是互斥的,并且与示例XML中的一个或另一个匹配。如果您的目的是同时允许两者,那么XSD1.0不允许“选择”混合属性和元素的内容

此外,您无法控制XML元素的自动关闭;这意味着对于Variata,以下内容有效:

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

在XSD 1.0中,您唯一的选择是以散文形式记录约束。(例如,在schema for schema中就是这样,它对元素声明具有类似的约束。)

在XSD1.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将第一个和第四个flower元素视为无效而拒绝

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

蓝色
蓝色
(也就是说,我的直觉是反对这种设计,因为它不必要地复杂:选择将颜色作为属性,或者选择将其作为子项。每个设计都是合理的事实并不意味着允许它在文档中变化是合理的设计。)

<flower color="red"></flower>
<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>