当一个XSLT导入另一个XSLT时,MalformedURLException

时间:2012-10-29 15:59:00

标签: java xslt rad

我遇到一个问题,其中一个XSLT文件导入另一个,导致我的应用程序抛出MalformedURLException。 main.xsl中的import语句如下所示:

<xsl:import href="transformCommon.xsl"/>

文件transformCommon.xslmain.xsl位于同一文件夹中。支持加载它的代码如下所示:

private void loadXSLTFiles(String xsltFile)
{
    TransformerFactory transformFactory = TransformerFactory.newInstance();  

    //tell the location of all of import file 
    transformFactory.setURIResolver(new ClassPathURIResolver());

    Templates cache=null;

    //cache XSLT source file for transformation reuse
    InputStream is = this.getClass().getClassLoader().getResourceAsStream(xsltFile);
    javax.xml.transform.Source xsltSource = new javax.xml.transform.stream.StreamSource(is);

    try
    {
        cache = transformFactory.newTemplates(xsltSource);
    }
    catch (TransformerConfigurationException domException)
    {
        LOG.logError("XSLT initialization error has occurred: " + domException.getMessage());
    }
    ...

堆栈跟踪是:

Caused by: java.net.MalformedURLException
    at java.net.URL.(URL.java:602)
    at java.net.URL.(URL.java:465)
    at java.net.URL.(URL.java:414)
    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
    at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.xalan.templates.StylesheetRootProxy.(Unknown Source)
    ... 59 more

我不确定为什么会收到此错误。当我从main.xsl删除导入时,一切正常。当然,删除它不是一种选择,因为这一点的重点是将常用函数移动到单独的XSLT。

有趣的是,只有我的工作站似乎有这个问题。最初编写此代码的开发人员说他没有遇到任何问题。我正在使用RAD 7.5。有没有人知道如何在逐个工作站的基础上出现这个问题?

1 个答案:

答案 0 :(得分:5)

为了能够解析样式表中的相对URL(包括导入),您创建Source的{​​{1}}需要具有“系统ID”(即{的URL) {1}}文件)。

而不是

Templates

试试这个:

.xsl

//tell the location of all of import file transformFactory.setURIResolver(new ClassPathURIResolver()); //cache XSLT source file for transformation reuse InputStream is = this.getClass().getClassLoader().getResourceAsStream(xsltFile); javax.xml.transform.Source xsltSource = new javax.xml.transform.stream.StreamSource(is); 可以抛出URL xsltURL = this.getClass().getClassLoader().getResource(xsltFile); Source xsltSource = new StreamSource(xsltURL.openStream(), xsltURL.toExternalForm()); ,因此您需要将其添加到openStream或将整个内容包装在try / catch中。