Загрузка файла XSLT из файла JAR загружает сам файл JAR вместо XSLT - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть XSLT файл в пути к классам внутри файла JAR .Я попытался загрузить файл XSLT, используя InputStream.После отладки InputStream содержит файл JAR вместо файла XSLT.

String xslPath = "/com/japi/application/templates/foo.xslt";
InputStream is = getClass().getResourceAsStream(xslPath);
...
Source xslt = new StreamSource(is);
trans = factory.newTransformer(xsltSource); //Fatal error. Error parsing XSLT {0}

Я дважды проверил, что путь к файлу XSLT указан правильно, и физический файл включен в файл JAR.Есть идеи?

Ответы [ 3 ]

4 голосов
/ 19 ноября 2012

Создайте пользовательский резолвер, чтобы разрешить из набора путей к классам, что для Transfromer, чтобы проверить, у меня был файл jar, заданный в classpath в проекте eclipse

весь код приведен ниже ----- пример запуска ------------- `

public class RunTransform {

    public static void main(String[] args) {

        //  SimpleTransform.transform("xsl/SentAdapter.xsl", "C:/Amin/AllWorkspaces/ProtoTypes/XsltDemo/xml/acc.xml");

        SimpleTransform.transform("xslt/ibanvalidation/accuity-ibanvalidationresponse.xsl", "C:/Amin/AllWorkspaces/ProtoTypes/XsltDemo/xml/acc.xml");
    }

}

-----------Sample transfomring example ----------------

package com;

import java.io.File;
import java.io.FileOutputStream;


import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;


public class SimpleTransform {

    public static void transform(String xslName,String xmlName) {
        try {  
            ResourceResolver resloader = new ResourceResolver();
              TransformerFactory tFactory = TransformerFactory.newInstance();
              tFactory.setURIResolver(resloader);

              StreamSource xsltSRC = new StreamSource(resloader.resolve(xslName));

              Transformer transformer = tFactory.newTransformer(xsltSRC);

              StreamSource xmlSSRC = new StreamSource(xmlName);
              System.out.println("Streamm sources created .....");

              System.out.println("XSLT SET ....");
              transformer.transform(xmlSSRC, new StreamResult(new FileOutputStream(new File("C:/Amin/AllWorkspaces/ProtoTypes/XsltDemo/xml/result.xml"))));
              System.out.println("Finished transofrmation ..........");
              System.out.println("************* The result is out in respoinse *************");


             } catch (Throwable t) {
                      t.printStackTrace();
             }

    }

}

`


----------- Код для пользовательского распознавателя --------------- `

package com;

import javax.xml.transform.URIResolver;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;

public class ResourceResolver implements URIResolver {

    /* (non-Javadoc)
     * @see javax.xml.transform.URIResolver#resolve(java.lang.String, java.lang.String)
     */
    public Source resolve(String href, String base) throws TransformerException {

        try {

            InputStream is = ClassLoader.getSystemResourceAsStream(href);
            return new StreamSource(is, href);
        } // try
        catch (Exception ex) {
            throw new TransformerException(ex);
        } // catch
    } // resolve

    /**
     * @param href
     * @return
     * @throws TransformerException
     */
    public InputStream resolve(String href) throws TransformerException {
        try {

            InputStream is = ClassLoader.getSystemResourceAsStream(href);
            return is;
        } // try
        catch (Exception ex) {
            throw new TransformerException(ex);
        } // catch
    }
} // ResourceResolver

`

1 голос
/ 01 марта 2012

Попробуйте это

String pathWithinJar = "com/example/xslt/dummy.xslt";
InputStream is = java.lang.ClassLoader.getSystemResourceAsStream(pathWithinJar);

Тогда вы можете использовать IOUtils (apache) или одно из предложений здесь , чтобы преобразовать InputStream в строку или просто использовать javax.xml ...StreamSource конструктор, который принимает входной поток.

public static void transform(InputStream xslFileStream, File xmlSource, File xmlResult)
      throws TransformerException, IOException {

    // unknown if the factory is thread safe, always create new instance
    TransformerFactory factory = TransformerFactory.newInstance();
    StreamSource xslStreamSource = new StreamSource(xslFileStream);
    Transformer transformer = factory.newTransformer(xslStreamSource);

    StreamSource sourceDocument = new StreamSource(xmlSource);
    StreamResult resultDocument = new StreamResult(xmlResult);
    transformer.transform(sourceDocument, resultDocument);

    resultDocument.getOutputStream().flush();
    resultDocument.getOutputStream().close();
  }
0 голосов
/ 23 ноября 2010

InputStream содержит файл JAR вместо xslt file

Что заставляет тебя так говорить? Вы пытались распечатать содержимое InputStream в виде текста? Между созданием InputStream in и его использованием, вы делаете что-то еще с ним (часть ...)?

Если путь к getResourceAsStream указывает на XSLT и если is не является null после вызова, is должен содержать InputStream, представляющий ресурс XSLT. Как насчет вставки всей трассировки стека сюда?

...