2

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

4 に答える 4

2

スキーマの問題は、異なる属性で両方の時間に2回要素を指定したことです。これはXSDでは許可されていません。

概念的には、XSDがこのように機能する理由は、タイプを持つ要素を指定することになっているが、同じ要素に互換性のない2つのタイプがあるためです。

例えば:

<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

あなたが望むことを正確に行う方法はありません。あなたができる最善のことは、トレードオフを受け入れることです。たとえば、最初<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 に答える
1

XSD 1.1 では、条件付きの型割り当てを使用してこれを行うことができます。XSD 1.1 は現在、Saxon と Xerces でサポートされています。

于 2012-12-03T13:50:01.667 に答える
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 に答える