3

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

<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());
    }
    ...

堆栈跟踪是:

引起:java.net.MalformedURLException
    在 java.net.URL.(URL.java:602)
    在 java.net.URL.(URL.java:465)
    在 java.net.URL.(URL.java:414)
    在 org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(未知来源)
    在 org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(未知来源)
    在 org.apache.xerces.parsers.XML11Configuration.parse(未知来源)
    在 org.apache.xerces.parsers.XML11Configuration.parse(未知来源)
    在 org.apache.xerces.parsers.XMLParser.parse(未知来源)
    在 org.apache.xerces.parsers.AbstractSAXParser.parse(未知来源)
    在 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(未知来源)
    在 org.apache.xalan.templates.StylesheetRootProxy.(未知来源)
    ... 59 更多

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

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

4

1 回答 1

5

为了能够解析样式表(包括导入)中的相对 URL Source,您Templates需要从中创建“系统 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 中)。

于 2012-10-29T16:58:49.643 回答