2017-10-13 2 views
2

로 변신 동안 작동하지 않는하지만 난처럼 내 XSL에 format-dateTime 함수를 호출하고 아래XSLT 기능 형식 - 날짜 시간 나는 어쩌면 내가 뭔가 분명 실종, XSLT 스타일 시트를 사용하여 매우 새로운 오전 PDF

       <xsl:value-of 
            select="format-dateTime(header/requestDetail/startDate,'[D01]/[M01]/[Y] [H01]:[m01]:[s01]','en',(),())" /> 

는 그러나 이것은 지금까지의 내가 format-dateTime을 읽고으로는 XSLT 2.0 기능이 내장되어 있기 때문에 누군가가 이런 일이 왜 나를 말할 수 다음과 같은 오류 메시지가

SystemId Unknown; Line #215; Column #118; Could not find function: format-dateTime 
SystemId Unknown; Line #215; Column #118; A location path was expected, but the following token was encountered: ) 
SystemId Unknown; Line #215; Column #118; A location path was expected, but the following token was encountered: ) 
SystemId Unknown; Line #215; Column #118; function token not found. 
(Location of error unknown)java.lang.NullPointerException 
Exception in thread "main" java.lang.NullPointerException 

으로 반환합니다. 또한 필자의 메이븐 의존성에 SAXON의 최신 버전이 있습니다. 여기

는 전체 XSL 파일 여기

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"> 
    <xsl:output encoding="UTF-8" indent="yes" method="xml" 
     standalone="no" omit-xml-declaration="no" /> 
    <xsl:template match="users-data"> 
     <fo:root language="EN"> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="A4-portrail" 
        page-height="297mm" page-width="210mm" margin-top="5mm" 
        margin-bottom="5mm" margin-left="5mm" margin-right="5mm"> 
        <fo:region-body margin-top="25mm" margin-bottom="20mm" /> 
        <fo:region-before region-name="xsl-region-before" 
         extent="25mm" display-align="before" precedence="true" /> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="A4-portrail"> 
       <fo:static-content flow-name="xsl-region-before"> 
        <fo:table table-layout="fixed" width="100%" font-size="10pt" 
         border-color="black" border-width="0.4mm" border-style="solid"> 
         <fo:table-column column-width="proportional-column-width(20)" /> 
         <fo:table-column column-width="proportional-column-width(45)" /> 
         <fo:table-column column-width="proportional-column-width(20)" /> 
         <fo:table-body> 
          <fo:table-row> 
           <fo:table-cell text-align="left" display-align="center" 
            padding-left="2mm"> 
            <fo:block> 
             Bill Id: 
             <xsl:value-of select="header-section/data-type/@id" /> 
             , Date: 
             <xsl:value-of select="header-section/process-date" /> 
            </fo:block> 
           </fo:table-cell> 
           <fo:table-cell text-align="center" display-align="center"> 
            <fo:block font-size="150%"> 
             <fo:basic-link external-destination="http://www.example.com">XXX COMPANY 
             </fo:basic-link> 
            </fo:block> 
            <fo:block space-before="3mm" /> 
           </fo:table-cell> 
           <fo:table-cell text-align="right" display-align="center" 
            padding-right="2mm"> 
            <fo:block> 
             <xsl:value-of select="data-type" /> 
            </fo:block> 
            <fo:block display-align="before" space-before="6mm"> 
             Page 
             <fo:page-number /> 
             of 
             <fo:page-number-citation ref-id="end-of-document" /> 
            </fo:block> 
           </fo:table-cell> 
          </fo:table-row> 
         </fo:table-body> 
        </fo:table> 
       </fo:static-content> 
       <fo:flow flow-name="xsl-region-body" border-collapse="collapse" 
        reference-orientation="0"> 
        <fo:block>MONTHLY BILL REPORT</fo:block> 
        <fo:table table-layout="fixed" width="100%" font-size="10pt" 
         border-color="black" border-width="0.35mm" border-style="solid" 
         text-align="center" display-align="center" space-after="5mm"> 
         <fo:table-column column-width="proportional-column-width(20)" /> 
         <fo:table-column column-width="proportional-column-width(30)" /> 
         <fo:table-column column-width="proportional-column-width(25)" /> 
         <fo:table-column column-width="proportional-column-width(50)" /> 
         <fo:table-body font-size="95%"> 
          <fo:table-row height="8mm"> 
           <fo:table-cell> 
            <fo:block>Full Name</fo:block> 
           </fo:table-cell> 
           <fo:table-cell> 
            <fo:block>Postal Code</fo:block> 
           </fo:table-cell> 
           <fo:table-cell> 
            <fo:block>National ID</fo:block> 
           </fo:table-cell> 
           <fo:table-cell> 
            <fo:block>Payment</fo:block> 
           </fo:table-cell> 
          </fo:table-row> 
          <xsl:for-each select="user-bill-data"> 
           <fo:table-row> 
            <fo:table-cell> 
             <fo:block> 
              <xsl:value-of select="full-name" /> 
             </fo:block> 
            </fo:table-cell> 
            <fo:table-cell> 
             <fo:block> 
              <xsl:value-of select="postal-code" /> 
             </fo:block> 
            </fo:table-cell> 
            <fo:table-cell> 
             <fo:block> 
              <xsl:value-of select="national-id" /> 
             </fo:block> 
            </fo:table-cell> 
            <fo:table-cell> 
             <fo:block> 
              <xsl:value-of 
               select="format-dateTime(header/requestDetail/startDate,'[D01]/[M01]/[Y] [H01]:[m01]:[s01]','en',(),())" /> 
             </fo:block> 
            </fo:table-cell> 
            <fo:table-cell border="1pt solid black" 
             padding-left="2pt" text-align="left" padding-right="2pt"> 
             <fo:block font="8pt Helvetica"> 
              <xsl:value-of 
               select="format-dateTime(header/requestDetail/endDate,'[D01]/[M01]/[Y] [H01]:[m01]:[s01]','en',(),())" /> 
             </fo:block> 
            </fo:table-cell> 
            <xsl:value-of select="price" /> 
           </fo:block> 
           </fo:table-cell> 
           </fo:table-row> 
          </xsl:for-each> 
         </fo:table-body> 
        </fo:table> 
        <fo:block id="end-of-document"> 
         <fo:instream-foreign-object> 
          <svg width="200mm" height="150mm" version="1.1" 
           xmlns="http://www.w3.org/2000/svg"> 
           <path 
            d="M153 334 
C153 334 151 334 151 334 
C151 339 153 344 156 344 
C164 344 171 339 171 334 
C171 322 164 314 156 314 
C142 314 131 322 131 334 
C131 350 142 364 156 364 
C175 364 191 350 191 334 
C191 311 175 294 156 294 
C131 294 111 311 111 334 
C111 361 131 384 156 384 
C186 384 211 361 211 334 
C211 300 186 274 156 274" 
            style="fill:yellow;stroke:red;stroke-width:2" /> 
          </svg> 
         </fo:instream-foreign-object> 
        </fo:block> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 
</xsl:stylesheet> 

입니다

공공 최종 클래스 PDFConverter {

private PDFConverter() { 

} 

private static final String RESOURCES_DIR; 
private static final String OUTPUT_DIR; 

static { 
    RESOURCES_DIR = "src//main//resources//"; 
    OUTPUT_DIR = "src//main//resources//output//"; 
} 

public static void main(final String[] args) { 
    try { 
     convertToPDF(); 
    } catch (FOPException | IOException | TransformerException e) { 
     e.printStackTrace(); 
    } 
} 

public static void convertToPDF() throws IOException, FOPException, TransformerException { 
    // the XSL FO file 
    File xsltFile = new File(RESOURCES_DIR + "//template.xsl"); 
    // the XML file which provides the input 
    StreamSource xmlSource = new StreamSource(new File(RESOURCES_DIR + "//data.xml")); 
    // create an instance of fop factory 
    FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()); 
    // a user agent is needed for transformation 
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    // Setup output 
    OutputStream out; 
    out = new java.io.FileOutputStream(OUTPUT_DIR + "//output.pdf"); 

    try { 
     // Construct fop with desired output format 
     Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); 

     // Setup XSLT 
     TransformerFactory factory = TransformerFactory.newInstance(); 
     Transformer transformer = factory.newTransformer(new StreamSource(xsltFile)); 

     // Resulting SAX events (the generated FO) must be piped through to 
     // FOP 
     Result res = new SAXResult(fop.getDefaultHandler()); 

     // Start XSLT transformation and FOP processing 
     // That's where the XML is first transformed to XSL-FO and then 
     // PDF is created 
     transformer.transform(xmlSource, res); 
    } finally { 
     out.close(); 
    } 
} 

}

+0

클래스 경로에서 가지고있는 색션 버전 및 버전을 알려주실 수 있습니까? 당신의 스타일 시트는'version = "1.0"'이고 Saxon 9.8 HE는 다른 에러 메시지를 야기 할지라도 실행하지 않을 것입니다. XSLT를 어떻게 실행합니까? Saxon이 FOP에서 XSLT 프로세서로 사용 했습니까? –

+0

@MartinHonnen Sason-HE-9.8.0-5. 내 수업 경로에 사용 중입니다. XSLT를 실행하려면 PDF로 변환되는 FOP를 사용하는 Java 클래스가 있어야합니다. – user6248190

+1

내가 말했듯이 Saxon 9.8에서'version = "1.0"스타일 시트를 실행하면 이전 버전과의 호환성을 지원하지 않는다는 오류가 발생합니다. 따라서 자바 클래스는 Saxon을 사용하지 않고 Xalan 스타일 시트를 변환하면'format-dateTime'이 발견되지 않고'()'이 구문 오류를 발생시킵니다. 따라서 Java 또는 FOP 용 태그를 추가하고 Java 코드를 표시하면 익숙한 사람이 Xalan이 아닌 Saxon을 사용하는 방법을 제안 할 수 있습니다. 또한 XSLT 버전을 '3.0'으로 변경해야합니다. –

답변

2
PDF로 변환하는 FOP를 사용하는 자바 클래스,

Saxon이 Trans로 사용되는지 확인하는 방법은 http://saxonica.com/html/documentation/using-xsl/embedding/jaxp-transformation.html을 참조하십시오. 전, 당신이 색슨 (그리고 다른 XSLT 엔진) 당신의 변환을 수행하는로드되어 있는지 확인하려면

말한다, 당신은 JAXP의 TransformerFactory 클래스의 색슨의 구현의 클래스 이름을 알아야합니다 . 사용하는 Saxon 에디션에 따라 다릅니다.

Any : net.sf.saxon.TransformerFactoryImpl. 이렇게하면 소프트웨어 및 라이센스 파일을 기반으로 Saxon 구성이 생성되며 이는 클래스 경로에서 런타임에 사용할 수 있습니다.

TransformerFactory factory = TransformerFactory.newInstance();TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();으로 변경하면 코드에서 Saxon을 사용해야합니다.

version="1.0" 스타일 시트의 하위 호환성 코드 실행을 지원하지 않으므로 Saxon 9.8 HE를 사용하는 경우 XSLT 코드에 version="3.0"을 설정하는 것도 잊지 마십시오.