XSD架构验证问题

时间:2015-02-19 05:36:27

标签: xml xsd-validation

我有一个无法验证的模式片段。

<?xml version="1.1" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:group name="colorrgbGroup">
    <xs:all>
        <xs:element name="r" type="xs:unsignedShort" minOccurs="1" maxOccurs="1"/>
        <xs:element name="g" type="xs:unsignedShort" minOccurs="1" maxOccurs="1"/>
        <xs:element name="b" type="xs:unsignedShort" minOccurs="1" maxOccurs="1"/>
        <xs:element name="a" type="xs:unsignedShort" minOccurs="0" maxOccurs="1"/>
    </xs:all>
</xs:group>

<xs:group name="colornameGroup">
    <xs:all>
        <xs:element name="colorName" type="xs:normalizedString" minOccurs="1" maxOccurs="1"/>
        <xs:element name="a" type="xs:unsignedShort" minOccurs="0" maxOccurs="1"/>
    </xs:all>
</xs:group>

<xs:group name="colorpresetGroup">
    <xs:all>
        <xs:element name="preset" type="xs:normalizedString" minOccurs="1" maxOccurs="1"/>
        <xs:element name="a" type="xs:unsignedShort" minOccurs="0" maxOccurs="1"/>
    </xs:all>
</xs:group>

<xs:element name="color">
    <xs:complexType>
        <xs:choice minOccurs="1" maxOccurs="1">
            <xs:group ref="colorpresetGroup"/>
            <xs:group ref="colornameGroup"/>
            <xs:group ref="colorrgbGroup"/>
        </xs:choice>
    </xs:complexType>
</xs:element>
</xs:schema>

我想说元素颜色作为一个孩子有三个可能的组之一,并且一次只能有一个选项。如您所见,所有三个选项都将alpha通道视为可选。

如果我更改了&#39;&lt;&#x; xs:all&#39;&gt;&#39;标签为&#39;&lt;&#39; xs:sequence&#39;&gt;&#39;标签可以正确验证。但对于&#34; colorrgbGroup&#34;我们希望用户能够放置RGBA,ABGR,ARGB,BGRA等,这就是为什么我们更喜欢使用&#39;&lt;&#x; xs:all&#39;&gt;&#39; over&#39;&lt;&#x; xs:sequence&#39;&gt;&#39;。

我正在使用此website来检查我的验证。

每个&#39; xs:group&#39;&gt;&#39;我的&#39;&lt;&#39; xs:choice&#39;&gt;&#39;中的选项给我以下错误。

  

错误 - 第30行,第51行:org.xml.sax.SAXParseException; lineNumber:30;   columnNumber:51 cos-all-limited。 1.2:全部&#39;模特组必须   出现在一个粒子中,{&#39; min出现&#39;}&#39; =&#39; {&#39; max出现&#39;}&#39; = 1,和   该粒子必须是构成&#39;内容的一对的一部分   类型&#39;}&#39;复杂类型定义。

我以前处理过模式并修改了现有的模式,但这是我第一次从头开始编写。非常感谢任何帮助!

谢谢! 托德

1 个答案:

答案 0 :(得分:1)

基本上,您不能将xs:all与xs:choice或xs:sequence混合使用。如果您的内容模型使用xs:all,则可以使用它。

规则名称cos-all-limited类型总结了它......

即使群体中没有共同的元素也不会被允许,所以它不仅仅是模糊性(遇到一个&#39; a&#39;作为第一个孩子而不是知道哪个群体使用了“问题”。这只是你无法做到的事情。