在XSD中根据其他XML字段的值设置minOccurs和maxOccurs?

时间:2016-11-08 12:52:01

标签: xml xsd xsd-validation xml-validation

我有一个XSD来验证XML文件。结构如下:

<root>
    <child>
        <size>2</size>
        <childElement>Element 1</childElement>
        <childElement>Element 2</childElement>
    </child>
</root>

childElement的数量取决于提供的大小,即如果size设置为3,则可以添加不超过3 childElement

我尝试使用xs:alternative,但似乎无效:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="child" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="size" type="xs:integer" maxOccurs="1"/>
                            <xs:element name="childElement" type="xs:string" maxOccurs="1">
                                <xs:alternative test="@size>1" maxOccurs="@size"/>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

有没有办法使用xs:alternative或其他标签来实现这一目标,或者这是否超出了XSD的可能范围?

1 个答案:

答案 0 :(得分:3)

设计建议:如果您的XML设计仍然可以更改,请删除size元素并隐式传达该信息,而不是显式传达。通过消除重复信息,您无需检查复制是否一致。

如果您的XML设计仍无法更改,或者您选择不更改它......

XSD 1.0

不可能。必须在XSD外带外检查。

XSD 1.1

可以使用xs:assert

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           vc:minVersion="1.1">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="child">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="size" type="xs:integer"/>
              <xs:element name="childElement" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:assert test="count(childElement) = size"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>