1

我有一个包含多个元素的 XML 模式,每个元素都有两个相同类型的子元素(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

4

1 回答 1

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>
于 2011-11-18T15:44:53.257 回答