解析対象外テキスト・リゾルバーの使用
XUnparsedTextResolver インターフェースは実装できます。 また、このインターフェースを XDynamicContext に登録された実装として指定することで、XSLT unparsed-text 関数を通じて ロードされたリソースのデフォルトの解決動作をオーバーライドすることができます。
このタスクについて
XSLT unparsed-text 関数を通じてロードされたリソースに対する デフォルトの解決動作としては、静的コンテキストからの基本 URI を基に 相対 URI を解決します。基本 URI が使用可能でない場合は、 現行作業ディレクトリーが使用されます。絶対 URI はそのまま使用されます。
手順
XDynamicContext インターフェースで setUnparsedTextResolver メソッドを
使用して、解析対象外テキスト・リゾルバーを登録します。
例
以下に、解析対象外テキスト・リゾルバーを使用する基本的な例を示します。
XFactory factory = XFactory.newInstance();
// Prepare the stylesheet.
XSLTExecutable executable = factory.prepareXSLT(new StreamSource(stylesheetFile));
// Create the dynamic context and set the unparsed text resolver.
XDynamicContext dynamicContext = factory.newDynamicContext();
AnUnparsedTextResolver resolver = new AnUnparsedTextResolver(replacementBase);
dynamicContext.setUnparsedTextResolver(resolver);
// Execute the transformation.
Source source = new StreamSource(inputFile);
Result result = new StreamResult(System.out);
executable.execute(source, dynamicContext, result);
以下に、解析対象外テキスト・リゾルバー実装の
基本的な例を示します。
class AnUnparsedTextResolver implements XUnparsedTextResolver
{
String _replacementBase;
public AnUnparsedTextResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// Resolve URI, returning the resource that URI represents.
// Implements the "rebase:" pseudo-scheme.
public String getResource(String href, String encoding, String base) {
String rebasePrefix="rebase:";
if (href.startsWith(rebasePrefix)) {
href = href.substring(rebasePrefix.length());
base = _replacementBase;
}
try {
// Get base URI object
URI uri = new java.net.URI(base);
// Resolved relative reference against base URI
URI resolvedURI = uri.resolve(href);
// Try to read...
URL url = resolvedURI.toURL();
URLConnection urlCon = url.openConnection();
BufferedInputStream stream = new BufferedInputStream(urlCon.getInputStream());
StringBuffer buffer = new StringBuffer();
int s;
while ((s = stream.read())!= -1) {
// Do any character manipulation here.
buffer.append((char)s);
}
return buffer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}