XSD:独特粒子归因的解决方法

时间:2012-12-03 10:28:38

标签: xml xsd xsd-validation

我有这个模式触发了Unique Particle Attribution违规。我明白为什么,但我没有看到任何其他表达方式。架构是:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element name="Element" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType mixed="true">
            <xs:attribute name="First" use="required"/>
            <xs:attribute name="SomeAttribute" use="required"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="Element" minOccurs="0" maxOccurs="1">
          <xs:complexType mixed="true">
            <xs:attribute name="Second" use="required"/>
            <xs:attribute name="SomeOtherAttribute" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

以及它应该验证的XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Element First="true" SomeAttribute="abc"/>
    <Element Second="true" SomeOtherAttribute="def"/>
</Root>

我不想简化架构,这意味着我不想让任何属性选项,或允许属性之间的混合...另外我不能将“元素”的名称更改为某些内容比如“FirstElement”,“SecondElement”。 在XSD中可以解决这个问题吗?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

架构的问题在于,您已使用不同的属性两次赋予元素两次。这在XSD中是不允许的。

从概念上讲,XSD以这种方式工作的原因是你应该给出一个带有类型的元素,但你有两个不兼容的类型到同一个元素。

例如:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="FirstElement" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType mixed="true">
                    <xs:attribute name="First" use="required" />
                    <xs:attribute name="SomeAttribute" use="required" />
                </xs:complexType>
            </xs:element>
            <xs:element name="SecondElement" minOccurs="0" maxOccurs="1">
                <xs:complexType mixed="true">
                    <xs:attribute name="Second" use="required" />
                    <xs:attribute name="SomeOtherAttribute" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

这应该允许XML验证

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <FirstElement First="true" SomeAttribute="abc"/>
    <SecondElement Second="true" SomeOtherAttribute="def"/>
</Root>

答案 1 :(得分:1)

您可以使用条件类型分配在XSD 1.1中执行此操作。 Saxon和Xerces目前支持XSD 1.1。

答案 2 :(得分:1)

没有办法完全你想要的东西;你能做的最好就是接受权衡。例如,如果第一个<Element>发生了固定次数(不是变量),它就会起作用 - 这不是你想要的。

只是为了说明:

$ cat upa.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element name="Element" minOccurs="1" maxOccurs="1">  <!-- CHANGE -->
          <xs:complexType mixed="true">
            <xs:attribute name="First" use="required"/>
            <xs:attribute name="SomeAttribute" use="required"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="Element" minOccurs="0" maxOccurs="1">
          <xs:complexType mixed="true">
            <xs:attribute name="Second" use="required"/>
            <xs:attribute name="SomeOtherAttribute" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

$ cat upa.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Element First="true" SomeAttribute="abc"/>
    <Element Second="true" SomeOtherAttribute="def"/>
</Root>

$ xmllint --schema upa.xsd upa.xml --noout
upa.xml validates

答案 3 :(得分:0)

对于某些人来说,解决方案可能非常简单:

确保所有具有相同名称的元素(兄弟姐妹)使用相同的属性。

例如改变这个:

<g:FlowPanel addStyleNames="widget-wrap"/>
<g:FlowPanel styleName="widget-wrap"/>

对此:

<g:FlowPanel addStyleNames="widget-wrap"/>
<g:FlowPanel addStyleNames="widget-wrap"/>