我有一个XSD 1.0序列,它定义了一组元素,其中一些元素可以是可选的,但是它们都不会出现多次,并且也以 <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax"/>
标记结束,以便用户能够在其中添加自己的数据元素 . 以编程方式导出符合XML的最简单的方法(理想情况下,不需要他们定义自己的命名空间/ XSD) .
在处理用户生成的XML时,我将忽略它们通过 <any>
标记添加的任何自定义元素,但我想知道是否有办法强制执行元素名称的唯一性,以便我可以确定它们不会放置与 maxOccurs=1
序列中定义的元素重复?
这是一个示例xsd(交互式版本here):
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="testxsd" targetNamespace="testxsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="XSDSequence">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="itemA" type="xsd:string"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="itemB" type="xsd:string"
minOccurs="0" maxOccurs="1"/>
<xsd:element name="itemC" type="xsd:string"
minOccurs="1" maxOccurs="1"/>
<xsd:any minOccurs="0" maxOccurs="unbounded"
namespace="##any" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
这是一个示例XML,它传递XSD验证,但由于最后重复的 <itemA>
,我想错误地输出:
<XSDSequence xmlns="testxsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<itemA>foo</itemA>
<itemC>bar</itemC>
<randomElement>this is ok</randomElement>
<itemA>I want this second itemA to cause an error</itemA>
</XSDSequence>
(请注意,通过属性而不是元素捕获数据项是 not 我想要做的事情 . )
2 回答
不,在XSD 1.0中,一旦你允许任何元素,你就不能指定超出
minOccurs
,maxOccurs
,namespace
和processContents
所提供的限制条件 .在XSD 1.1中,您还可以对
xsd:any
元素进行xsd:assertions
;你可以用断言来表达你的约束 . [ Update :不要错过@C. M. Sperberg-McQueen's simpler idea for XSD 1.1:xsd:any/@notQName="itemA itemB itemC"
]也许确保元素
itemA
,itemB
和itemC
不重复的最简单方法是使用namespace="##other"
而不是namespace="##any"
. (这假设命名空间testxsd
中除了这三个元素之外的元素不需要在这里出现 . )或者转到XSD 1.1并添加属性
notQName="itemA itemB itemC"
.