2014-07-17 6 views
1

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> 
+0

"fo"를 사용하기 전에 네임 스페이스 선언을 정의하면 안됩니까? http://xmlgraphics.apache.org/fop/quickstartguide.html – apurvc

+0

스타일 시트 태그에 정의합니다. 필자가 올린 XSL-FO 코드는 FOP에서 불평하는 부분 이었지만, 전체 fo.xsl 파일은 꽤 길었고 필요한 모든 네임 스페이스 선언을 포함합니다. –

+0

죄송합니다, 어떤 아이디어가 없습니다. 상호 작용하는 여러 제품 (FOP, Saxon, Spring)이 관련된 두려운 시스템 문제는 StackOverflow 프로세스에별로 적합하지 않습니다. 처음으로 복제하지 않고는이를 해결할 수 없으며 복제를 만드는 것은 까다로울 수 있습니다. –

답변

0

나는이 업데이트되지 않습니다,하지만 난 문제가 마틴이 제안한대로 입력 파일이 실제로 올바른 네임 스페이스를 선언하지 않았다는 것을 알아 냈어 의견에. 다른 입력 파일을 완전히 사용하고있는 것으로 밝혀 졌을 때 특정 입력 파일을 사용하고 있다고 생각했습니다.