我的用例如下:我们有一个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中指定元素的集合名称不同?
答案 0 :(得分:0)
您可以使用xs:any/@notQName
在XSD 1.1中执行此操作以禁止使用特定名称。
我不认为可以在XSD 1.0中完成。