Ограничение на несколько элементов сложного типа - PullRequest
1 голос
/ 18 ноября 2011

У меня есть 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-схему 1.0

1 Ответ

1 голос
/ 18 ноября 2011

Если вы можете использовать XML-схему 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>
...