【问题标题】:Caching fetches of Java XSLT processor (Xalan) for document()为 document() 缓存 Java XSLT 处理器 (Xalan) 的提取
【发布时间】:2012-03-03 16:10:19
【问题描述】:
我在 JDK 1.6 (Xalan) 中使用 XSLT 处理器,并广泛使用 document() 函数从从 Web 下载的文档中检索数据项。此处理是作为呈现网页的工作的一部分完成的,当前每次提供页面时都会调用它。我知道有多种方法可以优化来自同一个 XSLT 脚本的同一个 document() 的多个评估,但我更关心的是减少网络上的点击量;也就是说,我想缓存要检索的外部文档(也因为我在尝试检索其中一些文档时经常会超时)。
我想(希望)Xalan 有一个用于检索外部文档的可插入类,我可以拦截它以注入我的缓存策略,但我在文档或浏览源中找不到它。有人可以指出它是否存在以及如何配置?谢谢。
【问题讨论】:
标签:
java
function
document
xalan
【解决方案1】:
好吧,在对调试器和源代码进行一些调整后,我在 javadocs 中找到了一个指针,而我在 Google 中没有找到。解决问题的类是 URIResolver,可以通过以下方式将其安装到 Transformer:
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
public class CachedURIResolver implements URIResolver
{
@Override
public Source resolve (final String href, final String base)
throws TransformerException
{
// TODO: caching logic
return new StreamSource(href);
}
}
...
final Transformer transformer = transformerFactory.newTransformer(transformation);
transformer.setURIResolver(new CachedURIResolver());
应该对 href 和 base 进行更精细的处理,我认为在相对 URL 的情况下,但在我的情况下不需要。