1

我正在尝试调整我的 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](或它们的替换组中的元素)违反“唯一粒子属性”。在针对此模式进行验证期间,将为这两个粒子创建歧义。

该规则在 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

4

2 回答 2

1

你写了:

该规则在 XSD v 1.1 中不再有效,但我所有的 XML 文件都是 1.0 版。但我认为不可能用较新的模式版本检查较旧的文件。

XML 版本与 XML Schema 版本无关!(另请参阅: 要使用什么 XML 版本?

XML 1.0 现在是主流,XML 模式 v1.1 也同样适用。

如果您的 v1.1 架构适合您,那么就使用它吧!

至于如何在 XSD 1.0 中表达您的模式约束,我也不清楚。恐怕,没有办法。(否则,他们不会在 XSD v1.1 中放宽 UPA 限制)。

<xs:any>只能针对特定的命名空间进行限制(如果那些“其他”元素来自与 不同的命名空间,<processName>那么这是可能的)。否则,我认为,唯一的方法是指定那些其他元素可能是哪些。

于 2013-08-27T01:09:24.640 回答
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 不支持在通配符中排除多个名称空间。

于 2015-11-17T11:09:21.240 回答