2013-08-01 2 views
0

Я хочу преобразовать XSLT с несколькими выходными файлами. Там я использовал «xsl: result-document». Когда преобразование завершается неудачно, все выходные файлы должны быть удалены. Но если генерация документа, созданного с помощью «xsl: result-document», терпит неудачу, моя программа больше не сможет удалить этот документ. Я думаю, причина в том, что «xsl: result-document» создает другой OutputStream. Кто-нибудь знает, как закрыть все выходные потоки?Saxon XSLT Transformation: Как закрыть выходной поток при сбое во время преобразования

Редактировать: Я использую Saxon 9.5 для преобразования.

Пожалуйста, смотрите ниже мой исходный код:

public void simpleTransform(String sourcePath, String xsltPath, String outputPath) 
{ 
String resultDir=outputPath+"/filename.html"; 
TransformerFactory tFactory = TransformerFactory.newInstance(); 
StreamSource ss = new StreamSource(new File(xsltPath)); 
StreamResult sr = new StreamResult(new File(resultDir)); 
Transformer transformer = tFactory.newTransformer(ss); 
try 
{ 
    transformer.transform(new StreamSource(new File(sourcePath)), sr); 
    System.out.println("Transformation finished!"); 
} 
catch (TransformerException te) 
{ 
    try 
    { 
     System.out.println("Transformation failed! Trying to close Outputstreams..."); 
     sr.getOutputStream().flush(); 
     sr.getOutputStream().close(); 
     transformer.reset(); 
     System.out.println("Outputstream closed!"); 
     try 
     { 
      FileUtils.deleteDirectory(new File(tempDirPath)); 
      System.out.println("Files succesfully deleted!"); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

ответ

3

Я подозреваю, что вы обнаружили ошибку. Я зарегистрировал его здесь: проследите за разрешением.

https://saxonica.plan.io/issues/1857

Вы можете обойти эту проблему путем регистрации своего собственного OutputURIResolver (возможно, на основе стандартного), который отслеживает все открытых выходные потоки и имеет возможность быть вызваны непосредственно приложением, чтобы закрыть их в конце.