Spring MVC 웹 응용 프로그램의 서비스 클래스 중 하나에서 서식 지정 객체를 사용하여 XML 파일을 변환하는 동안 오류가 발생했습니다.Saxon이 Spring MVC 응용 프로그램에서 특정 XSL 호출을 무시하고 FOP 예외를 발생 시킴
net.sf.saxon.trans.XPathException: org.apache.fop.fo.ValidationException: "fo:root" is missing child elements. Required content model: (layout-master-set, declarations?, bookmark-tree?, (page-sequence|fox:external-document)+) (See position 30:-1)
예외를 발생시키는 Java 코드는 내 서식 지정 개체에 설명 된 규칙에 따라 xml 파일을 pdf로 변환하는 데 사용됩니다. 문제 자바 코드 : 나는 예외가 말하려고하는 것을 알고
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="letter-first"
page-height="11in" page-width="8.5in" margin-top="0.25in">
<fo:region-body margin-top="1.0in" margin-bottom="0.75in"
margin-left="0.60in" margin-right="0.60in" />
<fo:region-before extent="0.7in" />
<fo:region-after extent="0.4in" />
</fo:simple-page-master>
<fo:simple-page-master master-name="letter-rest"
page-height="11in" page-width="8.5in" margin-top="0.25in">
<fo:region-body margin-top="0.5in" margin-bottom="0.75in"
margin-left="0.60in" margin-right="0.60in" />
<fo:region-after extent="0.4in" />
</fo:simple-page-master>
<fo:page-sequence-master master-name="letter">
<fo:single-page-master-reference
master-reference="letter-first" />
<fo:repeatable-page-master-reference
master-reference="letter-rest" />
</fo:page-sequence-master>
</fo:layout-master-set>
<!-- Drop in the body -->
<xsl:apply-templates />
</fo:root>
: 여기
FopFactory f = FopFactory.newInstance();
//Load the fop configuration file (for installing custom fonts)
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
Configuration cfg = cfgBuilder.buildFromFile(new File("src/main/webapp/resources/fop-config.xml"));
f.setUserConfig(cfg);
FOUserAgent agent = f.newFOUserAgent();
OutputStream os = new FileOutputStream(new File(resultFileName));
os = new BufferedOutputStream(os);
Fop fop = f.newFop(MimeConstants.MIME_PDF, agent, os);
//Load the formatting object
TransformerFactory fac = new net.sf.saxon.TransformerFactoryImpl();
Transformer t = fac.newTransformer(new StreamSource(new File("src/main/webapp/resources/fo.xsl")));
File file = new File(fileName);
Source src = new StreamSource(file);
Result r = new SAXResult(fop.getDefaultHandler());
//Perform the transformation and close resources
t.transform(src, r);
os.close();
그리고는 FOP 좋아하지 않는 것 내 서식 개체의 일부입니다 내가 fo : page-sequence 요소를 잃어 버렸다. 그러나이 요소는 루트 요소에 적용하려고하는 템플릿에 있습니다. FOP에 대해 불평 페이지 시퀀스의 요소를 포함
<xsl:template match="template">
<fo:page-sequence master-reference="letter"
: 바로 위의 코드 아래 , 내 템플릿을 선언합니다.
일반 Java 응용 프로그램에서이 정확한 코드를 시도했지만 예외없이 잘 실행됩니다. 그러나 스프링 MVC 웹 애플리케이션의 서비스 클래스를 돌릴 때, 갑자기 xsl 템플릿을 적용 할 수 없으며, 왜 그런지 전혀 알지 못한다.
내 웹 응용 프로그램에서 Saxon이 통화를 올바르게 해석하지 못하는 것 같지만 정확하게 동일한 코드를 사용하여 오프라인 Java 응용 프로그램에서 Saxon을 호출 할 수 있습니다.
누구에게 아이디어가 있습니까? 또한 더 많은 정보가 필요하면 알려주고 제공해 주시면 기꺼이 도와 드리겠습니다.
편집 : 색슨과 FOP 종속성 :
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.avalon.framework</groupId>
<artifactId>avalon-framework-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.avalon.framework</groupId>
<artifactId>avalon-framework-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.sourceforge.saxon</groupId>
<artifactId>saxon</artifactId>
<version>9.1.0.8</version>
</dependency>
"fo"를 사용하기 전에 네임 스페이스 선언을 정의하면 안됩니까? http://xmlgraphics.apache.org/fop/quickstartguide.html – apurvc
스타일 시트 태그에 정의합니다. 필자가 올린 XSL-FO 코드는 FOP에서 불평하는 부분 이었지만, 전체 fo.xsl 파일은 꽤 길었고 필요한 모든 네임 스페이스 선언을 포함합니다. –
죄송합니다, 어떤 아이디어가 없습니다. 상호 작용하는 여러 제품 (FOP, Saxon, Spring)이 관련된 두려운 시스템 문제는 StackOverflow 프로세스에별로 적합하지 않습니다. 처음으로 복제하지 않고는이를 해결할 수 없으며 복제를 만드는 것은 까다로울 수 있습니다. –