2

我有这个触发唯一粒子归属违规的架构。我明白为什么,但我没有看到任何其他方式来表达它。架构是:

<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”之类的名称", "第二元素"。在 XSD 中有没有办法解决这个问题?

谢谢你的帮助!

4

4 回答 4

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>
于 2012-12-03T10:35:29.403 回答
1

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

于 2012-12-03T13:50:01.667 回答
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
于 2012-12-03T14:11:00.607 回答
0

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

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

例如改变这个:

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

对此:

<g:FlowPanel addStyleNames="widget-wrap"/>
<g:FlowPanel addStyleNames="widget-wrap"/>
于 2015-02-10T17:56:17.867 回答