1

自分では直せない問題があります。私のXSDは非常に複雑ですが、ここでは同じ問題を抱えているより単純なコードです。

これはXSDです:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema id="Race"
           xmlns:xs = "http://www.w3.org/2001/XMLSchema"
           targetNamespace="myrace.org/"
           xmlns="myrace.org/"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

  <xs:element name="race" msdata:IsDataSet="true">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="runner" type="runnerType" maxOccurs="10">
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:keyref name="predecessorKey" refer="runKey">
      <xs:selector xpath="runner/predecessor"/>
      <xs:field xpath="@foreignKey"/>
    </xs:keyref>
    <xs:unique name="runIdChecker">
      <xs:selector xpath="runner"/>
      <xs:field xpath="@primaryKey"/>
    </xs:unique>
    <xs:unique name="oneToOneChecker">
      <xs:selector xpath="runner/predecessor"/>
      <xs:field xpath="@foreignKey"/>
    </xs:unique>
    <xs:key name="runKey">
      <xs:selector xpath="runner"/>
      <xs:field xpath="@primaryKey"/>
    </xs:key>
  </xs:element>

  <xs:complexType name="runnerType">
    <xs:sequence>
      <xs:element name="firstName" type="xs:string"/>
      <xs:element name="lastName" type="xs:string"/>
      <xs:element name="predecessor" type="predecessorType" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="primaryKey" type="xs:long" use="required"/>
  </xs:complexType>

  <xs:complexType name="predecessorType">
    <xs:attribute name="foreignKey" type="xs:long" use="required"/>
  </xs:complexType>

</xs:schema>

XSDは正常に機能しますが、2つの同様のprimaryKeyを書き込むとエラーが発生するはずですが、そうではありません。

一方、頭を次のように変更した場合:

<xs:schema id="Race"
           xmlns:xs = "http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

それが動作します。しかし、私のグローバルプロジェクトとの一貫性の理由から、ヘッドを変更することはできず、最初のコードと同等のXSD->XML間の接続を定義する必要があります。

誰かが私の問題が何であり、私が何ができるかについて何か考えを持っていますか?

ありがとう

ベンジャミン

4

1 に答える 1

2

この回答を見てください。特に、スキーマが名前空間を対象とする場合、セレクターとフィールドに名前空間プレフィックスを使用する必要性について述べている部分です。

したがって、xmlns:my="myrace.org/" を追加して、セレクターを次のように変更するだけですmy:runner/my:predecessor。属性は修飾されていないため、心配する必要はありません。

私は正確さのためにあなたの制約を視覚化していませんが、問題が発生した場合は投稿を更新してください.

于 2012-09-04T22:40:01.227 に答える