2

AccountStructureItem および EventItem タイプの 2 つのリスト (「AccountStructures」および「Events」) を含む Event という名前の xsd があります。AccountStructureItem に SourceId というプロパティがあり、一意かつキーとして定義されています。EventItem タイプには、AccountStructureItem の SourceId への参照である SourceId プロパティもあります。

AccountStructureItem の ID を次のように宣言しました。

<xs:unique name="accounts_unique">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:unique>

<xs:key name="accounts_key">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:key>

この関係は 1 対多であり、同じ AccountStructureItem の SourceId を参照する多くの EventItem が存在する可能性があります。したがって、EventItem のキーは別のプロパティです。

私の質問: 以下の xs:keyref を使用して、accountstructure の accounts_key に keyreference 制約を作成しようとすると、エラーが発生します。

<xs:keyref name="events_constraint" refer="accounts_key">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:keyref>

検証に続くエラー メッセージは次のとおりです。

以下に示す完全な XSD とテスト xml ファイルを参照してください。

<!-- XSD -->

<xs:element name="Event">
    <xs:complexType>
      <xs:sequence>
        <!--Information Start-->
        <xs:element minOccurs="1" maxOccurs="1" nillable="false" name="Information" type="ct:Information" />
        <!--Information End-->

        <!--AccountStructure Start-->
        <xs:element name="AccountStructures">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="AccountStructureItem">
                <xs:complexType>
                  <xs:complexContent mixed="false">
                    <xs:extension base="ct:AccountStructureItem" />
                  </xs:complexContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>

          <xs:unique name="accounts_unique">
            <xs:selector xpath="AccountStructureItem"/>
            <xs:field xpath="SourceId"/>
          </xs:unique>

          <xs:key name="accounts_key" id="accounts_key_id">
            <xs:selector xpath="AccountStructureItem"/>
            <xs:field xpath="SourceId"/>
          </xs:key>

        </xs:element>
        <!--AccountStructure End-->

        <!--Events Start-->
        <xs:element name="Events" minOccurs="1" maxOccurs="1" nillable="false">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="EventItem" minOccurs="1" maxOccurs="10000">
                <xs:complexType>
                  <xs:complexContent mixed="false">
                    <xs:extension base="ct:EventItem" />
                  </xs:complexContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>

          <xs:unique name="events_unique">
            <xs:selector xpath="EventItem"/>
            <xs:field xpath="SourceEventId"/> <!-- events has a different key -->
          </xs:unique>

          <xs:key name="events_key">
            <xs:selector xpath="EventItem"/>
            <xs:field xpath="SourceEventId"/> <!-- events has a different key -->
          </xs:key>

          <xs:keyref name="events_constraint" refer="accounts_key">
            <xs:selector xpath="AccountStructureItem"/>
            <xs:field xpath="SourceId"/>
          </xs:keyref>

        </xs:element>
        <!--Events End-->
      </xs:sequence>
    </xs:complexType>
  </xs:element>


<!-- XML -->

<AccountStructures>

    <AccountStructureItem>
      <SourceId>AC1</SourceId>
      <AccountStructureType>Site</AccountStructureType>
      <ParentSourceId>000017252</ParentSourceId>
      <Name>Oras Isometsän tehdas</Name>
      <Street>Isometsäntie 2</Street>
      <City>RAUMA</City>
    </AccountStructureItem>

    <AccountStructureItem>
      <SourceId>AC2</SourceId>
      <AccountStructureType>Site</AccountStructureType>
      <ParentSourceId>000017252</ParentSourceId>
      <Name>Oras Oy lomamökki</Name>
      <Street>Lomapolku 15</Street>
      <City>RAUMA</City>
    </AccountStructureItem>


  </AccountStructures>

  <Events>

    <EventItem>
      <SourceId>AC1</SourceId>
      <AccountStructureType>SiteLocation</AccountStructureType>
      <SourceEventId>123</SourceEventId>
      <EventDate>2012-06-20T17:57:26</EventDate>
      <EventText>
        <EnglishValue> Oras/Isometsän tehdas Oras Isometsä  </EnglishValue>
        <LocalValue> Oras/Isometsän tehdas Oras Isometsä  </LocalValue>
      </EventText>
      <Objects>
        <Object>
          <EnglishValue>Location</EnglishValue>
          <LocalValue>Location</LocalValue>
        </Object>
      </Objects>
      <Type>
        <EnglishValue>Round</EnglishValue>
        <LocalValue>Round</LocalValue>
      </Type>
      <Solutions>
        <Solution>
          <EnglishValue>On-site</EnglishValue>
          <LocalValue>On-site</LocalValue>
        </Solution>
      </Solutions>
      <EventValue>
        <UnitType>Integer</UnitType>
        <Value>1</Value>
      </EventValue>
      <Notes></Notes>
    </EventItem>

    <EventItem>
      <SourceId>AC1</SourceId>
      <AccountStructureType>SiteLocation</AccountStructureType>
      <SourceEventId>1234</SourceEventId>
      <EventDate>2012-06-20T17:57:26</EventDate>
      <EventText>
        <EnglishValue> Oras/Isometsän tehdas Oras Isometsä  </EnglishValue>
        <LocalValue> Oras/Isometsän tehdas Oras Isometsä  </LocalValue>
      </EventText>
      <Objects>
        <Object>
          <EnglishValue>Location</EnglishValue>
          <LocalValue>Location</LocalValue>
        </Object>
      </Objects>
      <Type>
        <EnglishValue>Round</EnglishValue>
        <LocalValue>Round</LocalValue>
      </Type>
      <Solutions>
        <Solution>
          <EnglishValue>On-site</EnglishValue>
          <LocalValue>On-site</LocalValue>
        </Solution>
      </Solutions>
      <EventValue>
        <UnitType>Integer</UnitType>
        <Value>1</Value>
      </EventValue>
      <Notes></Notes>
    </EventItem>
  </Events>
4

1 に答える 1

3

私は自分で解決策を得ました。問題は、要素リストでキーと参照を宣言したことです。key、unique、および ref の宣言を両方のリストの外に移動し、「list/item」xpath を使用してそれらにアクセスしました。このような:

  <xs:selector xpath="AccountStructures/AccountStructureItem"/>
  <xs:field xpath="SourceId"/>
</xs:unique>

<xs:key name="accounts_key" id="accounts_key_id">
  <xs:selector xpath="AccountStructures/AccountStructureItem"/>
  <xs:field xpath="SourceId"/>
</xs:key>

<xs:unique name="events_unique">
  <xs:selector xpath="Events/EventItem"/>
  <xs:field xpath="SourceEventId"/>
</xs:unique>

<xs:key name="events_key">
  <xs:selector xpath="Events/EventItem"/>
  <xs:field xpath="SourceEventId"/>
</xs:key>

<xs:keyref name="events_constraint" refer="accounts_key">
  <xs:selector xpath="Events/EventItem"/>
  <xs:field xpath="SourceId"/>
</xs:keyref>
于 2012-08-10T07:39:13.273 に答える