0

Web アプリケーションで xslt を使用して xml を変換しようとすると、Weblogic 10.3 サーバーで TransformerConfigurtionException 例外がスローされます。Tomcat 7.0 では、同じ Web アプリケーション コードが正常に動作します。この例外の原因が何であるかはわかりません。

Exception:
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
ERROR: 'Syntax error in 'format-date($date,'[MNn][D],[Y]','en',(),())'.'
FATAL ERROR: 'Could not compile stylesheet'

xslt で format-date 関数を削除した後、別の例外が発生しました (javax.xml.tranform.TransformerException:java.lang.ArrayIndexOutOfBoundsException

コード:

TransformerFactory factory = TransformerFactory.newInstance();

  try
  {
   factory.newTransformer().transform( new StreamSource( new StringReader( xml ) ), new StreamResult( transformResult ) );

   Source documentInfoSource = new StringSource( new String( transformResult.toByteArray() ) );
   transformResult.reset();

   factory.setURIResolver( new URIResolver()
   {
    @Override
    public Source resolve(String href, String base) throws TransformerException
    {
     try
     {
      return new StreamSource( EcrionDocumentRenderServiceImpl.class.getClassLoader().getResourceAsStream( href ) );
     }

     catch( Exception e )
     {
      throw new TransformerException( e );
     }
    }

   } );
   factory.newTransformer( new StreamSource( Thread.currentThread().getContextClassLoader().getResourceAsStream( "template.xsl" ) ) ).transform( documentInfoSource, new StreamResult( transformResult ) );TransformerFactory factory = TransformerFactory.newInstance();

  try
  {
   factory.newTransformer().transform( new StreamSource( new StringReader( xml ) ), new StreamResult( transformResult ) );

   Source documentInfoSource = new StringSource( new String( transformResult.toByteArray() ) );
   transformResult.reset();

   factory.setURIResolver( new URIResolver()
   {
    @Override
    public Source resolve(String href, String base) throws TransformerException
    {
     try
     {
      return new StreamSource( EcrionDocumentRenderServiceImpl.class.getClassLoader().getResourceAsStream( href ) );
     }

     catch( Exception e )
     {
      throw new TransformerException( e );
     }
    }

   } );
   factory.newTransformer( new StreamSource( Thread.currentThread().getContextClassLoader().getResourceAsStream( "template.xsl" ) ) ).transform( documentInfoSource, new StreamResult( transformResult ) );
4

1 に答える 1

1

format-date()XSLT 2.0 関数です。JAXP TransformerConfigurationFactory を使用して XSLT トランスフォーマーをロードする場合、返されるプロセッサーが XSLT 1.0 または 2.0 プロセッサーのどちらであるかを制御する方法はありません。クラスパスで何が検出されるかによって異なります。私の推測では、クラスパスに XSLT 2.0 プロセッサがなかったため、デフォルトの組み込み Xalan プロセッサがロードされており、これは XSLT 2.0 をサポートしていません (したがってformat-date())。

コードが XSLT 2.0 に依存している場合、

a)サクソンがクラスパスにあることを確認してください

b)置き換えて明示的にロードする

TransformerFactory factory = TransformerFactory.newInstance();

TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
于 2014-01-10T08:32:29.077 に答える