我有一个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>
(请注意,通过属性而不是元素捕获数据项是 不 我想要做的事情。)
答案 0 :(得分:2)
确保元素itemA
,itemB
和itemC
不重复的最简单方法可能是使用namespace="##other"
代替namespace="##any"
。 (这假设命名空间testxsd
中除了这三个元素之外的元素不需要在这里出现。)
或者转到XSD 1.1并添加属性notQName="itemA itemB itemC"
。
答案 1 :(得分:1)
不,在XSD 1.0中,一旦您允许任何元素,您就无法指定除minOccurs
,maxOccurs
所提供的限制之外的其他约束,namespace
和processContents
。
在XSD 1.1中,您还可以针对xsd:assertions
元素进行xsd:any
;你能用断言来表达你的约束。 [更新:对于XSD 1.1不要错过@C. M. Sperberg-McQueen's simpler idea:xsd:any/@notQName="itemA itemB itemC"
]