我正在尝试调整我的xsd,它允许作为子元素,其名称为 processName ,否则为任何元素。
为此,我准备了一个小的 complexType :
<complexType name="configType">
<!-- <xsd:choice> -->
<sequence>
<element name="processName" type="string" maxOccurs="1"/>
<xsd:any minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<!-- </xsd:choice> -->
</complexType>
我的问题是它不会阻止 processName 的任何其他事件:
<config>
<process:processName></process:processName>
<test></test>
<test2></test2>
<process:processName></process:processName>
</config>
我试图使用选择,但它以验证错误结束
processName和WC [## any](或来自其替换组的元素)违反“Unique Particle Attribution”。在针对此模式进行验证期间,将为这两个粒子创建歧义。
规则在XSD v 1.1,中不再有效,但我的所有XML文件都是1.0版。但我认为不可能用较新的模式版本检查旧文件。
此特定示例不再违反XML Schema 1.1版中的唯一粒子属性约束,该约束通过说当元素与元素粒子和通配符匹配时消除歧义,元素粒子获胜。但是,UPA约束本身仍保留在1.1版本中。
是否可以仅强制执行 processName 的一次? 感谢任何提示。
修改
通过ColdFusion的一些提示,我能够创建一个XSD1.1模式,允许暧昧的声明:
<sequence>
<element name="processName" type="string" minOccurs="0" maxOccurs="1"/>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</sequence>
现在可以多次 processName 。
答案 0 :(得分:1)
您写道:
规则在XSD v 1.1中不再处于活动状态,但我的所有XML文件都是1.0版。但我认为不可能用较新的架构版本检查旧文件。
XML版本与XML Schema版本无关! (也可以看看: What XML version to use?)
XML 1.0现在是主流,XML模式v1.1同样适合它。
如果您的v1.1架构适合您,那就使用它吧!
至于如何表达您在XSD 1.0中的架构约束对我来说也不清楚。 可能没有办法。 (否则,它们不会在XSD v1.1中缓解UPA限制)。
<xs:any>
只能针对特定名称空间进行约束
(如果那些'其他'元素来自与<processName>
不同的命名空间,那么这是可能的)。
否则,我认为,唯一的方法是指定其他元素究竟是哪个。
答案 1 :(得分:0)
通配符也是粒子,当与可选元素(或其他通配符)混合时,可能会导致违反UPA。
<xs:complexType name="bad2">
<xs:sequence>
<xs:element name="A" type="xs:string" minOccurs="0"/>
<xs:element name="B" type="xs:string" minOccurs="0"/>
<xs:any/>
</xs:sequence>
</xs:complexType>
有时通过在通配符粒子上使用namespace =“## other”属性可以避免通配符冲突,但是如果扩展内容模型以处理多个命名空间中的元素,则可能会出现问题。 XML Schema 1.0不支持在通配符中排除多个名称空间。