質問

このような大きなXMLファイルに制約を適用する必要があります。

<library>
    <book>
        <bookAuthor ID="1" nameAlias="PeerBR jr"/>
    </book>
    <book>
        <bookAuthor ID="1"/>
    </book>
</library>
<authorCatalogue>
    <author ID="1" name="PeerBr"/>
</authorCatalogue>

有効な著者を参照するには、各BookAuthorのIDが必要です。

私は「制限されたXpath」が非常に不器用に働くのは非常に不器用ですが、何かを見落とすかもしれません。私はこのように制約を定義する正しいですか:

<xs:keyref name="bookAuthor" refer="author">
    <xs:selector xpath="library/book/bookauthor"/>
    <xs:field xpath="@ID"/>
</xs:keyref>        
<xs:key name="author">
    <xs:selector xpath="authorCatalogue/author"/>
    <xs:field xpath="@ID"/>
</xs:key>

動作しますが、私のファイルは実際にはよりネストされているので、本当に乱雑になります。さらに、「ライブラリ/ブック/共著者」の新しい制約を作成する必要があります。これ以上エレガントなことはありませんか?セレクターを省略できませんか?

制約の適用を制限できますか( "bookauthor [@namealias])?

よろしくお願いします。

役に立ちましたか?

解決

O'Reillyの「XML Schema」で答えを見つけました。持っていても大丈夫です:

  • 子要素を持つ相対パス
  • 名前空間
  • すべての要素( "*")
  • 任意の子要素(私の場合の「.//bookauthor」がトリックを行います)

次のような派手なものを含めても大丈夫ではありません。

  • 親要素
  • テスト( [@namealias]なので、namealias属性を持つノードにのみ制約を適用する方法はありません)
  • 絶対パス

これが誰かが後で問題につまずくのに役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top