Ошибка трансформации из-за xsl: include - PullRequest
6 голосов
/ 03 ноября 2008

У меня есть проект Java maven, который включает преобразования XSLT. Я загружаю таблицу стилей следующим образом:

TransformerFactory tFactory = TransformerFactory.newInstance();

DocumentBuilderFactory dFactory = DocumentBuilderFactory
                .newInstance();

dFactory.setNamespaceAware(true);

DocumentBuilder dBuilder = dFactory.newDocumentBuilder();

ClassLoader cl = this.getClass().getClassLoader();
java.io.InputStream in = cl.getResourceAsStream("xsl/stylesheet.xsl");

InputSource xslInputSource = new InputSource(in);
Document xslDoc = dBuilder.parse(xslInputSource);

DOMSource xslDomSource = new DOMSource(xslDoc);

Transformer transformer = tFactory.newTransformer(xslDomSource);

В файле stylesheet.xsl есть несколько операторов. Это, кажется, вызывает проблемы, когда я пытаюсь запустить свои юнит-тесты, я получаю следующие ошибки:

C:\Code\workspace\app\dummy.xsl; Line #0; Column #0; Had IO Exception with stylesheet file: footer.xsl
C:\Code\workspace\app\dummy.xsl; Line #0; Column #0; Had IO Exception with stylesheet file: topbar.xsl

Операторы включения в XSLT являются относительными ссылками

xsl:include href="footer.xsl"
xsl:include href="topbar.xsl"

Я попытался поэкспериментировать и изменить их на следующее - но я все еще получаю ошибку.

xsl:include href="xsl/footer.xsl"
xsl:include href="xsl/topbar.xsl"

Есть идеи? Любая помощь высоко ценится.

Ответы [ 4 ]

11 голосов
/ 03 ноября 2008

Решил мою проблему с помощью URIResolver.

class MyURIResolver implements URIResolver {
@Override
public Source resolve(String href, String base) throws TransformerException {
  try {
    ClassLoader cl = this.getClass().getClassLoader();
    java.io.InputStream in = cl.getResourceAsStream("xsl/" + href);
    InputSource xslInputSource = new InputSource(in);
    Document xslDoc = dBuilder.parse(xslInputSource);
    DOMSource xslDomSource = new DOMSource(xslDoc);
    xslDomSource.setSystemId("xsl/" + href);
    return xslDomSource;
 } catch (...

И присвоение этого с помощью TransformerFactory

tFactory.setURIResolver(new MyURIResolver());
8 голосов
/ 21 июня 2012

URIResolver также можно использовать более простым способом, как показано ниже:

class XsltURIResolver implements URIResolver {

    @Override
    public Source resolve(String href, String base) throws TransformerException {
        try{
              InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("xslts/" + href);
              return new StreamSource(inputStream);
        }
        catch(Exception ex){
            ex.printStackTrace();
            return null;
        }
    }
}

Используйте URIResolver с TransformerFactory, как показано ниже:

TransformerFactory transFact = TransformerFactory.newInstance();
transFact.setURIResolver(new XsltURIResolver());

Или с лямбда-выражением:

transFact.setURIResolver((href, base) -> {
    final InputStream s = this.getClass().getClassLoader().getResourceAsStream("xslts/" + href);
    return new StreamSource(s);
});
1 голос
/ 03 ноября 2008

Установите объект DocumentBuilder с помощью EntityResolver .

Вам потребуется расширить класс EntityResolver для разрешения ваших внешних сущностей (footer.xsl и topbar.xsl).

0 голосов
/ 03 ноября 2008

У меня была проблема, похожая на эту, с относительными путями в XSLT.

Если можете, попробуйте указать абсолютные пути в XSLT - это должно устранить ошибку.

Абсолютный путь, вероятно, не предпочтителен для окончательной версии XSLT, но он должен решить проблему maven. Возможно, у вас может быть две версии XSLT, одна с абсолютными путями для maven и одна с относительными путями для любого другого инструмента, с которым он используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...