XSD:允许任何顺序的元素集,但如果它们的名称不同于已定义元素集

时间:2017-10-11 08:19:11

标签: xml xsd

我的用例如下:我们有一个XSD,它只允许任何顺序的一组元素。这是我们在程序中使用的元素集。实际的XML由外部方提供。格式也由外部方控制,他们希望能够扩展格式而不必强制更改代码(更新后的XSD)。因此,我们希望使用XSD来验证今天的格式,但如果它们与明确定义的名称不同,则允许添加其他元素。

我们的尝试是使用一系列元素来定义"已知"元素并在末尾添加一个xsd:any语句。但是,这个任何语句都允许指定与我们的"已知"相同名称的元素。元素。在这个用例中这是不可接受的,因为这些已知元素最多只能出现一次。

我们知道,为了允许已知元素的任何顺序,我们需要在XSD中包含所有顺序排列。但是在stackoverflow上有解决方案。我只是提到这个约束。

我们的尝试(剥离到最小的例子):

<?xml version="1.0" standalone="yes"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="MainElement">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="A" type="xs:string" minOccurs="1" maxOccurs="1"/>
              <xs:element name="B" type="xs:string" minOccurs="1" maxOccurs="1" />
              <xs:element name="C" type="xs:string" minOccurs="0" maxOccurs="1"/>
              <xs:element name="D" type="xs:string" minOccurs="0" maxOccurs="1"/>
              <xs:element name="E" type="xs:string" minOccurs="1" maxOccurs="1" />
              <xs:any minOccurs="0" processContents="skip"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

此XSD接受以下XML(所需):

<?xml version="1.0" standalone="yes"?>
<Root>
  <MainElement>
    <A>1</A>
    <B>2</B>
    <C>3</C>
    <E>4</E>
    <Unknown>10</Unknown>
  </MainElement>
  <MainElement>
    <A>1</A>
    <B>2</B>
    <D>3</D>
    <E>4</E>
  </MainElement>
</Root>

但是这个XML也是有效的,这是不可接受的:

<?xml version="1.0" standalone="yes"?>
<Root>
  <MainElement>
    <A>1</A>
    <B>2</B>
    <C>3</C>
    <E>4</E>
    <A>5</A>
  </MainElement>
</Root>

如何添加仅允许其他XML元素的限制,这些元素的名称与XSD中指定元素的集合名称不同?

1 个答案:

答案 0 :(得分:0)

您可以使用xs:any/@notQName在XSD 1.1中执行此操作以禁止使用特定名称。

我不认为可以在XSD 1.0中完成。