尝试强制单个元素出现时的唯一粒子属性误差

时间:2013-08-26 20:20:58

标签: xsd

我正在尝试调整我的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

2 个答案:

答案 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不支持在通配符中排除多个名称空间。