Xsd 尝试强制元素单一出现时出现唯一粒子属性错误

Xsd 尝试强制元素单一出现时出现唯一粒子属性错误,xsd,Xsd,我正在尝试调整我的xsd,使其允许一个名为processName的元素作为子元素,以及其他任何元素。 为此,我准备了一个小型的complexType: <complexType name="configType"> <!-- <xsd:choice> --> <sequence> <element name="processName" type="string" maxOccurs="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>
<config>
    <process:processName></process:processName>
    <test></test>
    <test2></test2>
    <process:processName></process:processName>
</config>

我的问题是,它不能阻止任何其他进程名的出现:

<complexType name="configType">
<!--    <xsd:choice> -->
    <sequence>
        <element name="processName" type="string" maxOccurs="1"/>
        <xsd:any minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
<!--    </xsd:choice> -->
</complexType>
<config>
    <process:processName></process:processName>
    <test></test>
    <test2></test2>
    <process:processName></process:processName>
</config>

我尝试过使用choice,但它以验证错误结束

processName和WC[##any](或其替换组中的元素)违反“唯一粒子属性”。在根据该模式进行验证期间,将为这两个粒子创建歧义

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

此特定示例不再违反XMLSchema版本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 v 1.1中不再有效,但我的所有XML文件都是1.0版。但我认为不可能用较新的模式版本检查较旧的文件

XML版本与XML模式版本无关! (另见: )

XML1.0现在是主流,XMLSchemasV1.1也同样适用

如果你的v1.1模式适合你,那就使用它吧

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

只能对特定名称空间约束
(如果这些“其他”元素来自与
不同的名称空间,则这是可能的)。 否则,我认为,唯一的方法就是指定那些其他元素可能是什么。

您写道:

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

XML版本与XML模式版本无关! (另见: )

XML1.0现在是主流,XMLSchemasV1.1也同样适用

如果你的v1.1模式适合你,那就使用它吧

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

只能对特定名称空间约束
(如果这些“其他”元素来自与
不同的名称空间,则这是可能的)。
否则,我认为唯一的方法就是指定那些其他元素可能是什么。

通配符也是粒子,当与可选元素(或其他通配符)混合时,可能会导致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>


有时,通过使用命名空间=“##其他”可以避免通配符冲突属性,但如果内容模型扩展为处理多个命名空间中的元素,则以后可能会出现问题。XML Schema 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>


有时,通过使用命名空间=“##其他”可以避免通配符冲突属性,但如果内容模型扩展为处理多个命名空间中的元素,则以后可能会出现问题。XML Schema 1.0不支持在一个通配符中排除多个命名空间。

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