3

ある XSLT ファイルが別の XSLT ファイルをインポートするという問題が発生し、アプリケーションが MalformedURLException をスローします。の import ステートメントは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());
    }
    ...

スタック トレースは次のとおりです。

原因: 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 に移動することでした。

また興味深いのは、私のワークステーションだけがこの問題を抱えているようだということです。最初にこのコードを書いた開発者は、問題はないと言っています。私はRAD7.5を使用しています。ワークステーションごとに、この問題がどのように発生するかを知っている人はいますか?

4

1 に答える 1

5

Source作成元のスタイルシート (インポートを含む) で相対 URL を解決できるようにする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スローできるので、それを追加するか、すべてを try/catch でラップするIOException必要があります)。throws

于 2012-10-29T16:58:49.643 に答える