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



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

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

childElement s的数量取决于所提供的大小,即如果size设置为3,则不能添加超过3个childElement s。

我已经尝试使用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的可能性之外的领域?

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

如果您的XML设计仍然不能更改,或者如果您选择不更改它…

XSD 1.0

不可能的。必须在带外检查wrt 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>

最新更新