对复杂类型的几个元素的限制

时间:2011-11-18 13:48:29

标签: xsd restriction complextype xsd-1.0

我有一个包含多个元素的XML Schema,每个元素都有两个相同类型的子元素(oldValue& newValue)。 例如,类型可以是字符串,但我有几个具有不同maxLength限制的元素。最简单的定义方法是什么?

<xsd:sequence>
  <xsd:element name="foo">
    <xs:sequence>
      <xs:element name="oldValue" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:maxLength value="10"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="newValue">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:maxLength value="10"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xsd:element>

  <xsd:element name="bar">
    <xs:sequence>
      <xs:element name="oldValue" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:maxLength value="30"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="newValue">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:maxLength value="30"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xsd:element>
</xsd:sequence>

我需要定义很多这些元素,每个元素都有不同的限制。有没有比为每个限制定义复杂类型更简单的方法?

编辑:我需要使用XML Schema 1.0

1 个答案:

答案 0 :(得分:1)

如果可以使用XML Schema 1.1,则assert元素允许您向子结构添加约束。见http://www.w3.org/TR/xmlschema11-1/#cAssertions test属性允许XPath 2.0表达式。 例如:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > 
    <xs:group name="valuesGroup">
        <xs:sequence>
            <xs:element name="oldValue" type="xs:string"/>
            <xs:element name="newValue" type="xs:string"/>
        </xs:sequence>
    </xs:group>
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="foo">
                    <xs:complexType>
                        <xs:group ref="valuesGroup"/>
                        <xs:assert test="every $x in * satisfies 
                            (string-length($x) &lt;= 30)"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="bar">
                    <xs:complexType>
                        <xs:group ref="valuesGroup"/>
                        <xs:assert test="every $x in * satisfies 
                            (string-length($x) &lt;= 10)"/>
                    </xs:complexType>
                </xs:element>                
            </xs:sequence>
        </xs:complexType>        
    </xs:element>
</xs:schema>