로 변신 동안 작동하지 않는하지만 난처럼 내 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();
}
}
}
클래스 경로에서 가지고있는 색션 버전 및 버전을 알려주실 수 있습니까? 당신의 스타일 시트는'version = "1.0"'이고 Saxon 9.8 HE는 다른 에러 메시지를 야기 할지라도 실행하지 않을 것입니다. XSLT를 어떻게 실행합니까? Saxon이 FOP에서 XSLT 프로세서로 사용 했습니까? –
@MartinHonnen Sason-HE-9.8.0-5. 내 수업 경로에 사용 중입니다. XSLT를 실행하려면 PDF로 변환되는 FOP를 사용하는 Java 클래스가 있어야합니다. – user6248190
내가 말했듯이 Saxon 9.8에서'version = "1.0"스타일 시트를 실행하면 이전 버전과의 호환성을 지원하지 않는다는 오류가 발생합니다. 따라서 자바 클래스는 Saxon을 사용하지 않고 Xalan 스타일 시트를 변환하면'format-dateTime'이 발견되지 않고'()'이 구문 오류를 발생시킵니다. 따라서 Java 또는 FOP 용 태그를 추가하고 Java 코드를 표시하면 익숙한 사람이 Xalan이 아닌 Saxon을 사용하는 방법을 제안 할 수 있습니다. 또한 XSLT 버전을 '3.0'으로 변경해야합니다. –