コレクション・リゾルバーの登録
XCollectionResolver インターフェースの実装を XDynamicContext に登録できます。
手順
コレクション・リゾルバーを動的コンテキストに登録します。
XDynamicContext に登録された XCollectionResolver 実装は、fn:collection メソッドへの 呼び出し時に提供される URI に関連付けられたノードのコレクションを取得するために、 実行時に使用されます。 コレクション・リゾルバーを XDynamicContext に登録しない場合、fn:collection への 呼び出し結果はリカバリー可能エラーとなり、空のシーケンスがコレクションに使用されます。
コレクション・リゾルバー と fn:collection 関数は、文書 URI を解決するものではないことに注意してください。 この場合は、ソース・リゾルバーと fn:doc 関数を使用する必要があります。
例
以下に、コレクション・リゾルバーを使用する基本的な例を示します。
XFactory factory = XFactory.newInstance();
// Prepare the XPath expression
XPathExecutable executable = factory.prepareXPath("count(collection('typeA-typeB'))"
// Register the collection resolver with the dynamic context
XCollectionResolver collectionResolver = new ACollectionResolver(factory);
XDynamicContext dynamicContext = factory.newDynamicContext();
dynamicContext.setCollectionResolver(collectionResolver);
// Execute the XPath expression
XSequenceCursor cursor = executable.execute(dynamicContext);
以下は、XCollectionResolver 実装の基本的な例です。
public class ACollectionResolver implements XCollectionResolver {
private XFactory m_factory;
public ACollectionResolver(XFactory factory) {
m_factory = factory;
}
public XSequenceCursor getCollection(String uri, String base) {
// Get the default collection
if (uri.equals("")) {
return getCollection("default", base);
}
// Get the requested collection
ArrayList<XItemView> list = new ArrayList<XItemView>();
StringTokenizer tokenizer = new StringTokenizer(uri, "-");
XSequenceCursor cursor = null;
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
XSequenceCursor temp = getNodes(new StreamSource("collections.xml"), "/doc/" + token);
if (cursor == null) {
cursor = temp;
} else {
cursor = cursor.append(temp);
}
}
return cursor;
}
private XSequenceCursor getNodes(Source source, String expression) {
XPathExecutable executable = m_factory.prepareXPath(expression);
XSequenceCursor cursor = executable.execute(source);
return cursor;
}
}