【问题标题】:Restriction on several elements of a complex type对复杂类型的几个元素的限制
【发布时间】:2015-07-14 00:39:20
【问题描述】:

我有一个包含多个元素的 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

【问题讨论】:

    标签: xsd restriction complextype xsd-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>
    

    【讨论】:

    • 谢谢,这将是完美的解决方案,但不幸的是 XML Schema 1.1 是没有选择的
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多