【问题标题】:Unique Particle Attribution Error when trying to force single occurence of element尝试强制元素单次出现时出现唯一粒子属性错误
【发布时间】:2013-08-26 20:20:57
【问题描述】:

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

【问题讨论】:

    标签: xsd


    【解决方案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 限制)。

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

    【讨论】:

    • 感谢您的信息。在这种情况下,关于 xml 和 xsd 版本的事情是错误的。在哪里可以设置 xsd 版本?
    • 您不需要指定您的 XML 架构遵循哪个 XSD 版本(真的没有办法)。由于 XSD 1.0 是 XSD 1.1 的子集,因此您所需要的只是 XSD 1.1 感知模式处理器,例如“了解” XSD 1.1 的 XML 验证器。如果没有,它只会报告错误。
    • 好的,我该如何更正我的 xsd 符合我的规则?一个包含 processName 元素的选项和一个带有 any? 的序列
    • XSD 1.1 是相当新的(毕竟是在 2012 年发布的),所以它还没有得到广泛的支持。我刚刚搜索了“xsd 1.1 验证”。它找到了一些解决方案,包括免费的解决方案。我认为,您需要自己尝试一下,甚至可以稍后告诉我们您取得了什么成就。我自己现在没有时间做这个。但是您的问题看起来可以通过这种方式解决。
    • 好的,到目前为止找到了一个解决方案,但现在可能有重复。 ://
    【解决方案2】:

    通配符也是粒子,与可选元素(或其他通配符)混合时可能导致违反 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 不支持在通配符中排除多个命名空间。

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多