1

キーを順番に並べようとしていますが、エラーが発生しています。これはできないようです。さらに、キーにはフィールドとセレクターが必要であると言われていますが、ドキュメントはほとんど見つかりませんでした。(実際、必死になって、Liquid XML Studio [vs. Notepad]をダウンロードし、ヘルプファイルを検索しました。..「セレクター」という単語への参照すら見つかりませんでした。)とにかく、一意を保証するために使用できる別の方法は何ですか。 、シーケンス内の要素のnull値ではありませんか?(問題のコンテンツは文字列です)

キー要素がないと、スキーマが検証されることに注意してください。

エラー

cvc-complex-type.1.2.4ごとに無効:要素{http://www.w3.org/2001/XMLSchema}:ここでは許可されていないキー(1)要素{http://www.w3.org/2001 / XMLSchema}:sequence、expecting [{http://www.w3.org/2001/XMLSchema}:annotation、$、{http://www.w3.org/2001/XMLSchema}:element、{http:/ /www.w3.org/2001/XMLSchema}:group、{http://www.w3.org/2001/XMLSchema}:choice、{http://www.w3.org/2001/XMLSchema}:sequence、 {http://www.w3.org/2001/XMLSchema}:any]:

スキーマ

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="READOO" elementFormDefault="qualified">

  <xs:element name="ReferralCollection">
    <xs:complexType>
      <xs:sequence>
    <xs:key name="URL" type="string" />
        <xs:element maxOccurs="unbounded" name="keyword">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="occurrences" type="xs:int" use="required" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
4

2 に答える 2

2

要素は要素のkey内部に入ることは想定されていませんsequence。代わりに、xs:elementを定義する の子として配置しますReferralCollectionselectorおよびは、何が一意であるかを定義する要素のfield子要素です。keyどちらも XPath 式です。値はselectorXPath コンテキストを設定し、field要素 (複数存在する可能性があります) は、一意であると想定される値の組み合わせを定義します。したがって、あなたの場合、key要素は次のようになります。

<xs:key name="URL">
  <xs:selector xpath="."/>
  <xs:field xpath="rd:keyword"/>
</xs:key>

ここselectorでは、要素自体、つまり を選択しますReferralCollection。次に、そのコンテキストでは、field要素は要素の値を示し、keywordしたがって一意であることが制約されます。XPath の要素の値は、そのテキスト コンテンツです。

私はkey要素 (または一般的な XML スキーマ) をあまり扱っていないため、上記の詳細は正しくない可能性がありますが、基本的な考え方は私が説明したものなので、間違いを修正するのは簡単です。ああ、名前空間のrdプレフィックスを使用したことにも注意してください。READOO私の経験では、XPath を扱う場合は明示的なプレフィックスを使用するのが常に最善であるため、xmlns:rdこれを機能させるにはスキーマに適切な属性が必要です。

編集:したがって、次のようなものが必要なようです:

<xs:element name="ReferralCollection">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="URL" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="stem" type="xsd:string"/>
            <xs:element name="keyword" maxOccurs="unbounded">
            ...
            </xs:element>
          ...
  </xs:complexType>

  <xs:key name="URL">
    <xs:selector xpath="./URL"/>
    <xs:field xpath="stem"/>
  </xs:key>
</xs:element>

これはあなたが意図したことに近いですか?これにはURL、1 つ以上の要素があり、それぞれに 1 つ以上のstem要素が続く要素が含まれkeywordます。key制約は、stem要素のコンテンツを一意にする必要があります。

于 2009-10-10T19:31:06.487 に答える
0

このリンクが役立つかどうかを確認してください。

編集:数年前に以下のスキーマを構築しました。あなたの問題に適合することを確認してください:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:asp4d"
    xmlns:asp4d="urn:asp4d">
  <xs:element name="ASP4Developers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Links" minOccurs="1" maxOccurs="1">
          <xs:keyref name="kUserId" refer="asp4d:UserId">
            <xs:selector xpath="Link"/>
            <xs:field xpath="@UserId"/>
          </xs:keyref>
        </xs:element>
      </xs:sequence>
    </xs:complexType>

    <xs:key name="UserId">
      <xs:selector xpath="Users/User"/>
      <xs:field xpath="@UserId"/>
    </xs:key>

  </xs:element>

</xs:schema>
于 2009-10-10T19:25:26.467 に答える