2016-07-19 6 views
1

XMLスキーマを使用すると、XMLドキュメントのコンポーネント間にID/IDREFリンクを定義できます。私は、特定のIDだけがIDREFとして使用できるように、つまりスキーマ設計のコンテキストで論理的に意味を成す値だけを使用するために、XPathを使用する方法を探しています。XPathを使用するとID/IDREFの使用をチェックできますか?

以下の例を使用して、書籍のlibrary_idが実際には利用可能なlibrary_idsの1つであり、メッセージに表示され、全く異なる目的で使用される可能性のある他のIDではなく、 。

<books> 
    <book library_id="lib1"> 
     <author>A</author> 
     <title>B</title> 
    </book> 
    <book library_id="lib2"> 
     <author>C</author> 
     <title>D</title> 
    </book> 
    <library id="lib1"> 
     <name>X</name> 
     <city>Y</city> 
    </library> 
    <library id="lib2"> 
     <name>X</name> 
     <city>Y</city> 
    </library> 
</books> 

これを動作させるために最も近いのは、XPathに関数などが含まれている関数を使用することです。

contains(//library/@id,//book/@library_id) 

しかし、contains()( "lib1"、 "lib2")の最初の引数として複数の項目のシーケンスが許可されていないため、このエラーが発生します。私はあなたがライブラリーリストでlibrary_id存在と

ブックス間違ったlibrary_idと

//book[@library_id = //library/@id] 

ブックス

//book[not(@library_id = //library/@id)] 

答えて

0

ID/IDREFの代わりにkey/keyrefの制約がありますか?これらははるかに柔軟性があります。文書全体ではなく、要素にスコープ指定できます。ドキュメント内で異なる種類のIDを持つことができます。また、同じ種類のIDと照合する必要があります。値はコンポジット(例:名字+姓)でもかまいません。値は任意のデータ型にすることができます。

+0

ありがとう、これは私が必要としたものです! –

0

なぜ使うのXSDの望むものを正確に理解していることを願ってい

おかげ

+0

スキーマではオプションのID属性を使用する必要があります。これはkey/keyrefを使用しようとすると問題が発生します。 –

+0

それで、あなたはその限界を乗り越えなければならないでしょう。しかし、ID/IDREFでできることの多くは、key/keyrefではできないことを認識していません。 –

関連する問題