TransformerFactory上有多个URIResolver?

时间:2009-07-01 11:43:37

标签: java xml

我有一个Java中的XSLT Transformer(实际上它的Apache FOP呈现为PDF),我已经设置了一个自定义URIResolver(用于'servlet-context:'URIs)。

现在我需要另外使用另一个URIResolver(一个用于缓存DTD的CatalogResolver)。

现在我是否需要编写自己的URIResolver来调用其中任何一个或者是否有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

URIResolver无法解析引用时,它应返回null。这允许底层解析器尝试。

如果您设计了解析器,以便在构造时将其作为参数URIResolver,那么您可以使用解析器链接

TransformerFactory tf;
tf.setURIResolver(new SomeOtherResolver());
tf.setURIResolver(new MyResolver(tf.getURIResolver());

public class MyResolver implements URIResolver {
    public MyResolver(URIResolver nextInLine) {
        this.nextInLine = nextInLine;
    }
    private URIResolver nextInLine;
    public Source resolve(String href, String base) throws TransformerException {
        ...try to solve and return Source object...
        return nextInLine; // instead of returning null on failure, return nextInLine
    }
}

另一种方法是编写一个解析器,它允许你将一个解析器链设置为一个列表,并且会一直调用它们,直到返回非null的答案,然后返回它。