この章では、Oracle XML DBリポジトリのリソースでXLinkおよびXincludeを使用する方法について説明します。この章の内容は次のとおりです。
ドキュメント指向(またはコンテンツ管理)アプリケーションでは原則として、ドキュメント間の関係が追跡されます。これらの関係は通常、様々な形のリンクとして表され、操作されます。このようなリンクは、ドキュメント・コンテンツや、マウス・クリックなどのユーザー操作に対するレスポンスなどを含め、様々な面でアプリケーションの動作に影響を与えます。
W3C勧告では、XMLリポジトリで管理されるドキュメントに関して、このような場合に適した次の2つの仕様を推奨しています。
XLink: リソース間のリンクの様々なタイプを定義します。これらのリンクにより、ドキュメント間の任意の関係をモデル化できます。ドキュメントの場所については、リポジトリの内部と外部のどちらでもかまいません。
XInclude: 複数のXML文書またはXMLフラグメントのコンテンツを単一の情報セットにまとめる方法を定義します。これにより、包含関係をモデル化した複合ドキュメントを作成できます。複合ドキュメントとは、別のドキュメントを含めるドキュメントのことです。つまり、ドキュメントまたはドキュメント・フラグメントを含めるファイル・リソースです。含められるオブジェクトは、同じリポジトリ内のファイル・リソース、またはリポジトリの外部にあるドキュメントやフラグメントです。
これらの標準はそれぞれ非常に一般的なものであり、XML文書間の関係をモデル化する以外にも使用されます。XLinkを使用してリンクされたドキュメントや、XIncludeを使用してXML文書に含められたドキュメントは、必ずしもXML文書である必要はありません。
XLinkやXIncludeを使用してドキュメント間の関係を表すことにより、アプリケーションの柔軟性が高まるだけでなく、コンポーネント・ドキュメントが再利用しやすくなり、それに対するファイングレインな操作(アクセス制御、バージョニング、メタデータなど)が可能になります。XMLのデータ構造(祖先-子階層)を使用してモデル化された関係は、相対的に固定されたものですが、XLinkやXIncludeを使用してモデル化された関係は、容易に変更されます。
|
注意: XML Schemaに基づくドキュメントでXLinkやXIncludeの属性を使用可能にするには、XML Schemaでこれらの属性を明示的に宣言するか、または任意の属性の使用を許可する必要があります。 |
|
関連項目:
|
この項では、XLinkおよびXIncludeのリンク・タイプ、およびそれらのリンクとOracle XML DBリポジトリのリンクとの関係について説明します。XLinkリンクは、リポジトリ・リンクよりも一般的です。XLinkリンクには、単純リンクと拡張リンクがあります。Oracle XML DBでは単純XLinkリンクのみサポートしており、拡張リンクはサポートされていません。
XLinkリンクおよびXIncludeリンクを使用すると、ドキュメント間の任意の関係がモデル化されます。関係のセマンティクスは、リンクを使用するアプリケーションに依存し、リンク自体によっては決定されません。XLinkリンクおよびXIncludeリンクは、Oracle XML DBのドキュメント・リンクにマップできます。Oracle XML DBリポジトリのリソースをターゲットとするドキュメント・リンクは、(構成オプションに応じて)ハード・リンクか弱いリンクかのいずれかになります。この点については、リポジトリ・リンクと同様です。ただし、リポジトリ・リンクはFTPやHTTPなどのファイル・システムに関連するプロトコルによってナビゲートできるのに対し、ドキュメント・リンクはこうしたプロトコルではナビゲートできません。ドキュメント・リンクをナビゲートするには、XPath 2.0関数fn:docを使用します。
XLinkおよびXIncludeでは、他のドキュメントへのリンクを設定できます。XIncludeの場合、属性hrefおよびxpointerを使用してターゲット・ドキュメントを指定します。
XLinkリンクには、単純リンクと拡張リンクがあります。単純リンクは、ソースからターゲットへの単方向にのみ機能します。拡張リンク(複合リンクともいう)では、複数のドキュメント間の関係を、様々な方向でモデル化できます。単純リンクと拡張リンクはどちらも、リンク・メタデータを含む場合があります。XLinkリンクをXMLデータ内で表すには、事前定義された接頭辞xlinkを持つ名前空間http://www.w3.org/1999/xlinkの様々な属性を使用します。単純リンクは、XMLデータ内ではxlink:type="simple"のように属性typeと値simpleを使用して表されます。拡張XLinkリンクは、xlink:type="extended"で表されます。
サード・パーティの拡張XLinkリンクは、関係がモデル化されるいずれのドキュメントにも含まれません。そのためサード・パーティのリンクは、パイナリ・ファイルなど、それ自体ではリンクの表現手段を持たないドキュメントの関連付けに使用できます。
単純XLinkリンクのソース側(つまりリンクを含むドキュメント)は、XML文書である必要があります。ただしターゲット側には任意のドキュメントを使用できます。拡張リンクには、こうした制約はありません。例23-3は、単純リンクの例を示したものです。リンクのターゲットは、属性xlink:hrefにより表されています。
XIncludeは、複数のXML文書で構成される複数の情報セットを単一の情報セットにマージする構文および処理モデルに関するW3C勧告です。他のドキュメントを含める場合は要素xi:includeを使用し、属性hrefの値としてそのURIを指定します。要素xi:includeはネストできます。つまり、含められたドキュメント自体も、別のドキュメントを含めることができます。
(ただし、包含が循環しているとOracle XML DBでエラーが発生します。リソースは作成されますが、包含を展開するとエラーが発生します。)
このようにXIncludeによって、複合ドキュメント(他のXML文書またはXMLフラグメントを含めたリポジトリ・ファイル・リソース)を作成できます。含められるオブジェクトは、同じリポジトリ内のファイル・リソース、またはリポジトリの外部にあるドキュメントやフラグメントです。
1冊の本をコンテンツ管理システムで管理すると想定すると、その本は典型的な複合ドキュメントの1つと考えられます。それぞれの本には、各章ドキュメントが含められます。各章ドキュメントは、それぞれのURLを持つ別々のオブジェクトとして管理できます。章ドキュメントに対しては、それぞれ固有のメタデータおよびアクセス制御の設定が可能であり、バージョニングも可能です。1冊の本は、章ドキュメントの特定のバージョンを含める(参照する)場合があります。同一の章ドキュメントは、複数の本のドキュメントに含め、再利用できます。包含関係はXIncludeによりモデル化されるため、コンテンツ管理が容易になります。たとえば、1つの本の中である章を別の章に差し替えることも容易です。
例23-1は、4つのドキュメントを含むXMLのBook要素を示したものです。また、これらのドキュメントの1つであるpart1.xmlも示されています。これには章を表す別のドキュメントが含まれています。
例23-1 本のドキュメントに部および章を含めるためのXIncludeの使用方法
本を表す最上位のドキュメントには、要素Bookがあります。
<Book xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href=toc.xml"/> <xi:include href=part1.xml"/> <xi:include href=part2.xml"/> <xi:include href=index.xml"/> </Book>
本の主要部分であるファイル(リソース)part2.xmlには、複数の章ドキュメントを含むPart要素があります。
<?xml version="1.0"?> <Part xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="chapter5.xml"/> <xi:include href="chapter6.xml"/> <xi:include href="chapter8.xml"/> <xi:include href="chapter9.xml"/> </Part>
XIncludeには、その他に次の機能もあります。
プレーン・テキストの包含: 属性parseに値textを指定したparse="text"を使用し、未解析の非XMLテキストを含めることができます。
XMLフラグメントの包含: xi:include要素のxpointer属性を使用し、ドキュメント全体ではなくXMLフラグメントを指定して、それを含めることができます。
フォールバック処理: 含まれたドキュメントのURIにアクセスできないエラー、xi:include構文エラー、xpointer参照がNULLを戻すエラーなどが発生した場合、XIncludeでは、xi:fallback要素に指定されている処理が実行されます。通常は、含まれる代替要素を指定します。この代替要素では、他ドキュメントを含めるために、これ自体がxi:includeを使用します。
Oracle XML DBでは単純XLinkリンクのみサポートしており、拡張XLinkリンクはサポートされていません。
XLinkの属性を含むXML文書が、リソース・コンテンツまたはユーザー定義のリソース・メタデータとしてOracle XML DBリポジトリに追加された場合は、リポジトリまたは個々のリポジトリ・リソースの構成に基づいて特殊な処理が実行される場合があります。この処理は、リソース構成ドキュメントXDBResConfig.xsdの要素XLinkConfigによって指定されます。たとえば、XLinkリンクを無視したり、XLinkリンクをOracle XML DBのドキュメント・リンクにマップするようにリソースを構成できます。後者の場合は、構成でドキュメント・リンクをハード・リンクにするか弱いリンクにするかを指定できます。ハード・ドキュメント・リンクおよび弱いドキュメント・リンクにはそれぞれ、ハード・リポジトリ・リンクおよび弱いリポジトリ・リンクと同じプロパティがあります。
ドキュメント・リンクの作成や更新に必要な権限は、リポジトリ・リンクの作成や更新に必要な権限と同じです。ドキュメントを部分的に更新する場合でも、ドキュメント全体の削除や再挿入を行う場合と同じ権限が必要です。たとえばドキュメント・リンクを1つしか更新しない場合でも、そのリンクを含むドキュメントにリンクされている各ドキュメントの削除権限と挿入権限が必要です。
構成によりXLinkリンクがドキュメント・リンクにマップされている場合は、XLinkリンクを含むドキュメントがリポジトリに追加されるたびに、XLink情報が抽出され、システム・リンク表に格納されます。リンクのターゲット(リンク先)の場所は、リソースOIDに基づくダイレクト・パスに置き換えられます。構成では、ドキュメント取得の際にOIDパスを名前付きパス(URL)に置き換えるかどうかも指定できます。名前付きパスのかわりにOIDパスを使用すると、通常は、リソース・コンテンツを取得する場合も含め、リンク処理の際のパフォーマンスが向上します。
XLinkは、リソース・コンテンツ内では使用できますが、リソース・メタデータ内では使用できません。
Oracle XML DBでは、複合ドキュメント管理の標準メカニズムとしてXInclude1.0をサポートしています。ただし、属性xpointerおよびドキュメント・フラグメントの包含はサポートしていません。包含対象は完全なドキュメントのみです(属性hrefを使用)。
XIncludeを使用すると、既存のコンテンツを含めたXML文書を作成できます。また、XInclude包含参照を含む一連のリポジトリ・リソースを作成し、スキーマに基づかないXML文書の暗黙的な分解を構成することもできます。
含められるドキュメントのコンテンツは、XMLデータまたはプレーン・テキスト(属性parse="text"を使用)である必要があります。XIncludeでは、バイナリ・コンテンツは直接含めることはできません。ただし、XLinkを使用してバイナリ・コンテンツにリンクできます。
XIncludeは、リソース・コンテンツ内では使用できますが、リソース・メタデータ内では使用できません。
Oracle XML DBリポジトリから複合ドキュメントを取得する際、次のいずれかを選択できます。
xi:include要素を残した状態で、そのまま取得します。これがデフォルトの動作です。
xi:include要素を再帰的にそのターゲットに置き換えた(つまり、すべての包含を展開した)後に取得します。いずれかのxi:include要素が解決できない場合はエラーが発生します。
展開された形でドキュメントを取得するために、PL/SQLコンストラクタXDBURITypeを使用して、値'1'または'3'を2番目の引数(フラグ)として渡します。例23-2に、これを示します。XDBURITypeコンストラクタの2番目の引数として渡せるのは、次のいずれかの値です。
1: Xinclude包含をすべて展開した後で結果を戻します。これらの包含をXIncludeの標準的なフォールバック・セマンティクスに基づいて解決できない場合はエラーが発生します。
2: ドキュメント取得時に発生する可能性のあるすべてのエラーが抑止されます。たとえば、参照先がないhrefポインタなどのエラーです。
3: 1と2を指定した場合の処理が同時に行われます。
例23-2 XDBURITypeによるドキュメントの包含の展開
この例では、リポジトリ・フォルダpublic/bookdirにあるすべてのドキュメントを取得し、それぞれの包含を展開します。
SELECT XDBURIType(ANY_PATH, '1').getXML() FROM RESOURCE_VIEW
WHERE under_path(RES, '/public/bookdir') = 1;
XDBURITYPE(ANY_PATH,'1').GETXML()
---------------------------------
<Book>
<Title>A book</Title>
<Chapter id="1">
<Title>Introduction</Title>
<Body>
<Para>blah blah</Para>
<Para>foo bar</Para>
</Body>
</Chapter>
<Chapter id="2">
<Title>Conclusion</Title>
<Body>
<Para>xyz xyz</Para>
<Para>abc abc</Para>
</Body>
</Chapter>
</Book>
<Chapter id="1">
<Title>Introduction</Title>
<Body>
<Para>blah blah</Para>
<Para>foo bar</Para>
</Body>
</Chapter>
<Chapter id="2">
<Title>Conclusion</Title>
<Body>
<Para>xyz xyz</Para>
<Para>abc abc</Para>
</Body>
</Chapter>
3 rows selected.
(ここに示されている結果は、例23-8のリソースbookfile.xmlと、それに含まれているリソースchap1.xmlおよびchap2.xmlに対応するものです。)
|
関連項目:
|
複合ドキュメントの検証は、XML文書の検証と同じ方法で行います。ただし、複合ドキュメントの検証は、xi:include要素をそのまま使用するか、ターゲットに置き換えた形で行うかを選択できます。
また、展開されていない形での検証と展開された形での検証に、別々のXML Schemaを使用するように選択できます。たとえば、あるXML Schemaを使用して、最初は記憶域構造を設定できるよう展開せずに検証を行い、次に展開したドキュメントの格納後に、別のXML Schemaを使用して検証できます。
複合ドキュメントは、リソースと同じ方法で更新できます。その場合、リソースが新規の値で置き換えられます。つまり、複合ドキュメントの更新は、リソースを削除し、リソースを挿入する処理に相当します。したがって、元のリソース内のxi:include要素はいずれも削除されます。置換後の(挿入された)ドキュメント内のxi:include要素は、挿入時に定義された構成に従って通常どおり処理されます。
複合ドキュメントは、それぞれ個別のリソースで構成されます。したがって、このようなリソースのバージョンニング、ロックおよびアクセス制御も、それぞれ個別に行われます。
バージョン管理されたリソース(VCR)へのドキュメント・リンクは、常にターゲット・リソースの最新バージョン、または現在のワークスペース内で選択されたバージョンに解決されます。ただし、OIDベースのパスでターゲット・リソースを識別すると、特定のバージョンを明示的に参照できます。
xi:include要素を含むドキュメントをロックしても、含まれているドキュメントはロックされません。また、含まれているドキュメントをロックしても、それを含むドキュメントはロックされません。
展開した形で複合ドキュメントを取得する場合は、常に各参照ドキュメントのアクセス制御リスト(ACL)がチェックされます。このチェックには、現行ユーザーの権限(起動者権限)を使用します。含まれているドキュメントのいずれかについて権限が不十分な場合、展開はキャンセルされエラーが発生します。
読取り専用のパブリック・ビューDOCUMENT_LINKSに問い合せ、XLinkリンクおよびXIncludeリンクから導出されたドキュメント・リンクについてのシステム情報を取得できます。このビューでは、それぞれのリンクについて次の各列に情報が表示されます。
SOURCE_ID: ソース・リソースのOID(RAW(16))。
TARGET_ID: ターゲット・リソースのOID(RAW(16))。
TARGET_PATH: 常にNULL。今後使用予定で予約されています(VARCHAR2(4000))。
LINK_TYPE: ドキュメント・リンクのタイプ。HardまたはWeak(VARCHAR2(8))。
LINK_FORM: 元のリンクの形式。XLinkまたはXInclude(VARCHAR2(8))。
SOURCE_TYPE: 常にResource Content(VARCHAR2(17))。
次の条件を満たしている場合のみ、リソースに関する情報をこのビューから取得できます。
リソースがリンク・ソースであり、それに対して権限read-contentsまたはread-propertiesが付与されていること。
リソースがリンク・ターゲットであり、それに対して権限read-propertiesが付与されていること。
|
関連項目: パブリック・ビューDOCUMENT_LINKSの詳細は、『Oracle Databaseリファレンス』を参照してください。 |
例23-3は、リソース作成時にXLinkリンクを処理する方法、およびドキュメント・リンクに関するシステム情報をビューDOCUMENT_LINKSから取得する方法を示したものです。リソースが格納されているフォルダは、XLinkリンクをハード・ドキュメント・リンクにマップするように構成されているとみなされます。
例23-3 XLinkリンクからマップされたドキュメント・リンクの問合せ
DECLARE
b BOOLEAN;
BEGIN
b := DBMS_XDB.createResource(
'/public/hardlinkdir/po101.xml',
'<PurchaseOrder id="101" xmlns:xlink="http://www.w3.org/1999/xlink">
<Company xlink:type="simple"
xlink:href="/public/hardlinkdir/oracle.xml">Oracle Corporation</Company>
<Approver xlink:type="simple"
xlink:href="/public/hardlinkdir/quine.xml">Willard Quine</Approver>
</PurchaseOrder>');
b := DBMS_XDB.createResource(
'/public/hardlinkdir/po102.xml',
'<PurchaseOrder id="102" xmlns:xlink="http://www.w3.org/1999/xlink">
<Company xlink:type="simple"
xlink:href="/public/hardlinkdir/oracle.xml">Oracle Corporation</Company>
<Approver xlink:type="simple"
xlink:href="/public/hardlinkdir/curry.xml">Haskell Curry</Approver>
<ReferencePO xlink:type="simple"
xlink:href="/public/hardlinkdir/po101.xml"/>
</PurchaseOrder>');
END;
/
SELECT r1.ANY_PATH source, r2.ANY_PATH target, dl.LINK_TYPE, dl.LINK_FORM
FROM DOCUMENT_LINKS dl, RESOURCE_VIEW r1, RESOURCE_VIEW r2
WHERE dl.SOURCE_ID = r1.RESID and dl.TARGET_ID = r2.RESID;
SOURCE TARGET LINK_TYPE LINK_FORM
----------------------------- ------------------------------ --------- ---------
/public/hardlinkdir/po101.xml /public/hardlinkdir/oracle.xml Hard XLink
/public/hardlinkdir/po101.xml /public/hardlinkdir/quine.xml Hard XLink
/public/hardlinkdir/po102.xml /public/hardlinkdir/oracle.xml Hard XLink
/public/hardlinkdir/po102.xml /public/hardlinkdir/curry.xml Hard XLink
/public/hardlinkdir/po102.xml /public/hardlinkdir/po101.xml Hard XLink
例23-4は、すべてのドキュメント・リンクを表示するビューDOCUMENT_LINKSに対する問合せを示します。
例23-4 XIncludeリンクからマップされたドキュメント・リンクの問合せ
DECLARE
ret BOOLEAN;
BEGIN
ret := DBMS_XDB.createResource(
'/public/hardlinkdir/book.xml',
'<Book xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="/public/hardlinkdir/toc.xml"/>
<xi:include href="/public/hardlinkdir/part1.xml"/>
<xi:include href="/public/hardlinkdir/part2.xml"/>
<xi:include href="/public/hardlinkdir/index.xml"/>
</Book>');
END;
SELECT r1.ANY_PATH source, r2.ANY_PATH target, dl.LINK_TYPE, dl.LINK_FORM
FROM DOCUMENT_LINKS dl, RESOURCE_VIEW r1, RESOURCE_VIEW r2
WHERE dl.SOURCE_ID = r1.RESID and dl.TARGET_ID = r2.RESID;
SOURCE TARGET LINK_TYPE LINK_FORM
------ ------ --------- ---------
/public/hardlinkdir/book.xml /public/hardlinkdir/toc.xml Hard XInclude
/public/hardlinkdir/book.xml /public/hardlinkdir/part1.xml Hard XInclude
/public/hardlinkdir/book.xml /public/hardlinkdir/part2.xml Hard XInclude
/public/hardlinkdir/book.xml /public/hardlinkdir/index.xml Hard XInclude
リポジトリ・リソースの他の処理の構成と同様に、Oracle XML DBリポジトリ・リソースのXLinkおよびXInclude処理を構成します。「リソースの構成」を参照してください。この項の後半では、他のリソースのXLinkおよびXIncludeの処理を構成するためリソースとして使用するリソース構成ファイルについて説明します。
リソース構成ファイルは、パス/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/XDBResConfig.xsdにあるOracle XML DBリポジトリでアクセス可能な、XML Schema XDBResConfig.xsd準拠のXMLファイルです。XLinkおよびXIncludeの処理を構成するにはそれぞれ、要素ResConfigの子要素XLinkConfigおよびXIncludeConfigを使用します。これらのうち、いずれかの要素が存在しない場合、その要素に対応するタイプのリンクは処理できません。
XLinkConfigおよびXIncludeConfigの両方で、属性UnresolvedLinkと、子要素LinkTypeおよびPathFormatを使用できます。また要素XIncludeConfigでは、子要素ConflictRuleも使用できます。ただし、LinkType要素のコンテンツがNoneの場合、PathFormat要素およびConflictRule要素は使用できません。
XLinkConfigおよびXIncludeConfigには、事前条件は定義できません。新規リソースのXLinkリンクおよびXIncludeリンクの処理は、リポジトリ・リソースの作成時に親フォルダのResConfig要素によって指定されます。親フォルダにResConfig要素がない場合は、リポジトリ全般の構成が適用されます。
リソース構成ファイルの変更内容は、構成ファイルの変更後に作成または更新されたドキュメントにのみ適用されます。既存ドキュメント内のリンクを処理するには、適切なリソース構成パラメータを指定した上で、PL/SQLプロシージャDBMS_XDB.processLinksを使用します。
LinkConfig要素には、Error(デフォルト値)またはSkipの値のUnresolvedLink属性を使用できます。これは、ドキュメントをリポジトリに挿入する(リソースを作成する)際、XLinkリンクまたはXIncludeリンクを解決できない場合の処理を指定します。Errorを指定すると、エラーが発生し、現在の操作がロールバックされます。Skipを指定すると、XLinkリンクまたはXIncludeリンクの処理がスキップされます。処理がスキップされると、対応するドキュメント・リンクを含まずにリソースが作成され、そのリソースのHasUnresolvedLinks属性がtrueに設定されます。これは、リソースに未解決リンクが含まれていることを表すものです。
弱いリンクの循環を含むリソースを作成する場合は特に、属性UnresolvedLinkの値としてSkipを指定すると便利です。この値を指定しない場合は、リソース作成中に未解決リンクのエラーが発生します。スキップされたリンクは、リソースおよびそれにリンクするすべてのリソースが作成された後に、PL/SQLプロシージャDBMS_XDB.processLinksを使用して処理できます。このプロシージャによってすべてのXLinkリンクおよびXIncludeリンクが解決されると、属性HasUnresolvedLinksはfalseに設定されます。
削除済リソースへの弱いリンクのあるリソースには、リソース要素HasUnresolvedLinksもtrueに設定されます。このため、リソースを削除すると、そのリソースに対する弱いリンクも事実上削除されます。特に、リソースへの最後のハード・リンクを削除した場合は、リソースそのものも削除され、削除されたリソースを弱いリンクで示すすべてのリソースで、属性HasUnresolvedLinksがtrueに設定されます。
リソース構成ファイルのLinkType要素を使用して、ドキュメントのOracle XML DBリポジトリへの格納の際、XLinkリンクまたはXIncludeリンクが検出された場合に作成されるドキュメント・リンクのタイプを指定します。LinkType要素に指定できる値(要素のコンテンツ)は次のとおりです。
None(デフォルト): XLinkリンクおよびXIncludeリンクが無視され、対応するドキュメント・リンクは作成されません。
Hard: XLinkリンクまたはXIncludeリンクが、リポジトリ・ドキュメント内のハード・ドキュメント・リンクにマップされます。
Weak: XLinkリンクまたはXIncludeリンクが、リポジトリ・ドキュメント内の弱いドキュメント・リンクにマップされます。
xlink:href属性またはxi:include:href属性を含むドキュメントの取得時に使用されるパス形式を指定するには、リソース構成ファイルのPathFormat要素を使用します。ハード・ドキュメント・リンクおよび弱いドキュメント・リンクのそれぞれについて、PathFormat要素に指定できる値(要素のコンテンツ)は次のとおりです。
OID(デフォルト): XLinkまたはXIncludeのhrefパスが、リポジトリ・ドキュメント内のOIDベースのパスにマップされます。つまり、OIDが直接使用されます。
Named: XLinkまたはXIncludeのhrefパスが、リポジトリ・ドキュメント内の名前付きパス(URL)にマップされます。このパスは、ドキュメント取得時に内部OIDを基にして計算されます。そのため、OIDパスを直接使用する場合に比べ、取得に時間がかかります。
リソース構成ファイルのConflictRule要素を使用して、構成要素ドキュメントに対して計算済のパスがすでにOracle XML DBリポジトリ内にある場合に使用する競合解決ルールを指定します。ConflictRule要素に指定できる値(要素のコンテンツ)は次のとおりです。
Error(デフォルト): エラーが発生します。
Overwrite: 既存のリポジトリ・パスのターゲットとなっているドキュメントを、含まれているドキュメントに置き換えると更新されます。既存のドキュメントがVCRであれば、バージョニングが自動的に行われる場合を除いて、事前にチェックアウトされます。チェックアウトされていない場合は、エラーが発生します。
Syspath: 含まれているドキュメントへのパスが、新規システム定義のパスに変更されます。
リソース構成ファイルのSectionConfig要素を使用して、XInclude包含参照を含む一連のリソースを作成するために、スキーマに基づかないXML文書をOracle XML DBリポジトリに追加する際、このXML文書がどのように分解されるかを指定します。またリソース構成ファイルでは、単純なXPath式を使用して、ドキュメントのどの部分を個々のリソースにマップするか、およびマップ先のリソースはどれかを指定します。
要素SectionConfigには1つ以上のSection要素があり、それぞれに次の子要素が含まれています。
sectionPath: セクションのルートを指定する単純なXPath 1.0式。ここではchild軸およびdescendant軸のみを使用し、ワイルドカードは使用できません。
documentPath(オプション): 単純なXPath 1.0式。この式を評価することにより、sectionPathに従って分解されたドキュメントから作成されるリソースを識別します。このXPath式では、child軸、descendant軸、およびattribute軸のみを使用します。
namespace(オプション): sectionPathおよびdocumentPathの実際の名前空間。
また要素Sectionには、作成するセクションのタイプを指定するtype属性があります。値がDocumentの場合は、ドキュメントが作成されます。デフォルト値Noneの場合は何も作成されません。これは、SectionConfig要素を削除した場合に相当します。このため、type属性をNoneに設定すると、SectionConfig要素を削除せずに一時的に無効にできます。再度有効にする場合は、設定をDocumentに戻します。
リポジトリに追加されたドキュメント内の要素が、複数のsectionPath値と一致する場合は、(ドキュメントの順序における)最初の式のみが使用されます。
documentPath要素が存在しない場合、作成されたリソースにはシステム定義名が設定され、元のドキュメントに対して指定されたフォルダ内に格納されます。
例23-5は、XInclude処理を構成する構成ファイルのセクションを示します。ここではXInclude属性をOracle XML DBリポジトリのハード・ドキュメント・リンクにマップします。取得したリソース内のリポジトリ・パスは、リソースのOIDに基づいて構成されます。
例23-5 OIDによる取得時のXIncludeリンクからハード・ドキュメント・リンクへのマッピング
<ResConfig>
. . .
<XIncludeConfig UnresolvedLink="Skip">
<LinkType>Hard</LinkType>
<PathFormat>OID</PathFormat>
</XIncludeConfig>
. . .
</ResConfig>
例23-6は、XLinkリンクをリポジトリ内の弱いドキュメント・リンクにマップするためのXLinkConfigセクションを示したものです。この場合、ドキュメントの取得には名前付きパス(URL)が使用されます。
例23-6 名前付きパスによる取得時のXLinkリンクから弱いリンクへのマッピング
<ResConfig>
. . .
<XLinkConfig UnresolvedLink="Skip">
<LinkType>Weak</LinkType>
<PathFormat>Named</PathFormat>
</XLinkConfig>
. . .
</ResConfig>
例23-7は、入力ドキュメントをOracle XML DBリポジトリに追加する際、入力ドキュメントの各Chapter要素が別々のリポジトリ・ファイルになるように指定するSectionConfigセクションを示します。作成されたファイルのリポジトリ・パスは、構成要素documentPathによって指定され、このパスは、例23-6のリソース構成ファイルの場所に対する相対パスです。
例23-7 XIncludeを使用したドキュメントの分解の構成
<ResConfig>
. . .
<SectionConfig>
<Section type = "Document">
<sectionPath>//Chapter</sectionPath>
<documentPath>concat("chap", @id, ".xml")</documentPath>
</Section>
</SectionConfig>
. . .
</ResConfig>
この例のXPath式では、XPath関数concatによって次の文字列が連結され、使用するリポジトリ・パスが生成されます。
chap: (接頭辞)chap
入力ドキュメント内の要素Chapterの属性idの値
ファイル拡張子.xml
たとえばchap27.xmlのリポジトリ・パスは、入力ドキュメントのChapter要素のid属性の値が27の場合に生成されます。
<Chapter id="27"> ... </Chapter>
例23-6の構成ドキュメント、およびXInclude要素を含む本のドキュメントがリポジトリ・フォルダ/public/bookdirに格納されている場合、XInclude分解によって生成された個々の章ファイルは、ファイル/public/bookdir/chapN.xmlに取り込まれます。ただし、Nの値は、Chapter要素のid属性に指定された値です。
リポジトリに追加された本のドキュメントは、入力された本のドキュメントから生成されます。入力された本のドキュメントに埋め込まれているChapter要素は、生成された章ドキュメントを参照するxi:include要素に置き換えられます。例23-8にこれを示します。
例23-8 生成されたxi:include要素を表示するリポジトリ・ドキュメント
SELECT XDBURIType('/public/bookdir/bookfile.xml').getclob() FROM DUAL;
XDBURITYPE('/PUBLIC/BOOKDIR/BOOKFILE.XML').GETCLOB()
--------------------------------------------------------------------------------
<Book>
<Title>A book</Title>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="/public/bookdir/chap1.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="/public/bookdir/chap2.xml"/>
</Book>
PL/SQLプロシージャDBMS_XDB.processLinksを使用して、単一ドキュメント内、または1つのフォルダに格納された全ドキュメント内のXLinkリンクおよびXIncludeリンクをすべて手動で処理できます。ハード・リンクされたすべてのサブフォルダを再帰的に処理する場合は、RECURSIVEをモード引数としてこのプロシージャに渡します。すべてのXLinkリンクおよびXIncludeリンクは、対応する構成パラメータに従って処理されます。リソース内のいずれかのリンクを解決できない場合は、そのリソースのHasUnresolvedLinks属性がtrueに設定され、リソースに未解決リンクが含まれていることが示されます。属性HasUnresolvedLinksのデフォルト値はfalseです。