You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT格式非法时Transformer未抛异常,如何实现预期抛出逻辑?

XSLT格式不合法时newTransformer未抛出异常的解决方法

我通过XSL-FO将XML文件转换为PDF,流程依赖基于XSLT文件的Transformer。获取Transformer的代码如下:

private void prepareTransformer(final TransformerFactory tFactory)
throws TransformerConfigurationException {
    xmlTransformer = tFactory.newTransformer(
        new StreamSource(getClass().getResourceAsStream(xsltPath)));
}

当前存在的问题是,当XSLT格式不合法时,上述代码仅在控制台打印异常日志却不抛出异常,控制台输出如下:

System-ID unbekannt; Zeilennummer328; Spaltennummer69; xsl:when ist an dieser Position in der Formatvorlage nicht zulässig!
System-ID unbekannt; Zeilennummer63; Spaltennummer54; org.xml.sax.SAXException: javax.xml.transform.TransformerException: ElemTemplateElement-Fehler: testcaseDetails
javax.xml.transform.TransformerException: ElemTemplateElement-Fehler: testcaseDetails
(Position des Fehlers unbekannt)org.apache.fop.fo.ValidationException: Dem Element "fo:simple-page-master" fehlt ein verlangtes Property "master-name"! (Keine Kontextinformationen verfügbar)

由于库未抛出异常,我无法便捷处理该情况。我期望newTransformer(Source source)方法能够抛出异常,请问是否有实现该预期的方法?

附完整类代码:

@Log
public class Report {

  private final String xsltPath;
  private FopFactory fopFactory;
  private Transformer xmlTransformer;

  private Report(final String xsltPath) {
    this.xsltPath = xsltPath;
    try {
      prepareTransformer(createFobTransformer());
    } catch (final SAXException | IOException | ConfigurationException |
                   TransformerConfigurationException ex) {
      log.log(Level.SEVERE, null, ex);
      throw new PdfReportException(ex);
    }
  }

  public static Report getInstance() {
    return new Report("/report/report-regd.xslt");
  }
  private void prepareTransformer(final TransformerFactory tFactory)
      throws TransformerConfigurationException {
    xmlTransformer = tFactory.newTransformer(
        new StreamSource(getClass().getResourceAsStream(xsltPath)));
  }

  private TransformerFactory createFobTransformer()
      throws SAXException, IOException, ConfigurationException {
    final InputStream inFop = getClass().getResourceAsStream("/report/fop.xconf");
    final var fopBuilder = new FopFactoryBuilder(new File(".").toURI(),
        new ClasspathResolverURIAdapter());
    final var cfgBuilder = new DefaultConfigurationBuilder();
    final Configuration cfg = cfgBuilder.build(inFop);
    fopBuilder.setConfiguration(cfg);
    fopFactory = fopBuilder.build();
    final TransformerFactory tFactory = TransformerFactory.newInstance();
    tFactory.setURIResolver(new ClasspathURIResolver());
    return tFactory;
  }

  public byte[] generatePDFReport(final String xml) {
    final var out = new ByteArrayOutputStream();
    final var agent = fopFactory.newFOUserAgent();

    try {
      final var fop = agent.newFop(MimeConstants.MIME_PDF, out);
      final var result = new SAXResult(fop.getDefaultHandler());
      final var src = new StreamSource(new StringReader(xml));
      xmlTransformer.transform(src, result);
    } catch (final FOPException | TransformerException e) {
      throw new PdfReportException(e);
    }
    return out.toByteArray();
  }

  public static class PdfReportException extends RuntimeException {

    private static final long serialVersionUID = 6009368304491510184L;

    public PdfReportException(final Throwable cause) {
      super(cause);
    }
  }
}

另外,Report构造函数中未捕获到任何异常。

内容的提问来源于stack exchange,提问作者Julien Berthoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:55:20