当一个XSLT文件导入另一个XSLT文件时出现MalformedURLException异常

3

我遇到了一个问题,一个XSLT文件引入了另一个XSLT文件,导致我的应用程序抛出了MalformedURLException异常。在main.xsl中的导入语句如下:

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

transformCommon.xsl文件与main.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个回答

5
为了能够解析样式表中的相对URL(包括导入),创建模板时所使用的源Source需要具有“系统ID”(即.xsl文件的URL)。
不要使用:
//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 可能会抛出 IOException,所以您需要将其添加到 throws 中,或者将整个内容包装在 try / catch 语句中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接