#356 Added cli parameter to generate basic pdf version of xml report
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
package org.mustangproject.commandline;
|
package org.mustangproject.commandline;
|
||||||
|
|
||||||
import org.apache.commons.cli.*;
|
import org.apache.commons.cli.*;
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.mustangproject.CII.CIIToUBL;
|
import org.mustangproject.CII.CIIToUBL;
|
||||||
import org.mustangproject.EStandard;
|
import org.mustangproject.EStandard;
|
||||||
import org.mustangproject.FileAttachment;
|
import org.mustangproject.FileAttachment;
|
||||||
@@ -84,6 +85,7 @@ public class Main {
|
|||||||
+ " [--logAppend <text>]: text to be added to log line\n"
|
+ " [--logAppend <text>]: text to be added to log line\n"
|
||||||
+ " Additional parameters (optional - user will be prompted if not defined)\n"
|
+ " Additional parameters (optional - user will be prompted if not defined)\n"
|
||||||
+ " [--source <filename>]: input PDF or XML file\n"
|
+ " [--source <filename>]: input PDF or XML file\n"
|
||||||
|
+ " [--log-as-pdf]: save log output as pdf\n"
|
||||||
+ " --action validateExpectInvalid validate directory expecting negative results \n"
|
+ " --action validateExpectInvalid validate directory expecting negative results \n"
|
||||||
+ " [--no-notices]: refrain from reporting notices\n"
|
+ " [--no-notices]: refrain from reporting notices\n"
|
||||||
+ " Additional parameters (optional - user will be prompted if not defined)\n"
|
+ " Additional parameters (optional - user will be prompted if not defined)\n"
|
||||||
@@ -357,6 +359,7 @@ public class Main {
|
|||||||
options.addOption(new Option("d", "directory", true, "which directory to operate on"));
|
options.addOption(new Option("d", "directory", true, "which directory to operate on"));
|
||||||
options.addOption(new Option("i", "ignorefileextension", false, "ignore non-matching file extensions"));
|
options.addOption(new Option("i", "ignorefileextension", false, "ignore non-matching file extensions"));
|
||||||
options.addOption(new Option("l", "listfromstdin", false, "take list of files from commandline"));
|
options.addOption(new Option("l", "listfromstdin", false, "take list of files from commandline"));
|
||||||
|
options.addOption(new Option("log-as-pdf", "log-as-pdf", false, "saving log output to pdf file"));
|
||||||
|
|
||||||
boolean optionsRecognized = false;
|
boolean optionsRecognized = false;
|
||||||
String action = "";
|
String action = "";
|
||||||
@@ -380,6 +383,7 @@ public class Main {
|
|||||||
String format = cmd.getOptionValue("format");
|
String format = cmd.getOptionValue("format");
|
||||||
String lang = cmd.getOptionValue("language");
|
String lang = cmd.getOptionValue("language");
|
||||||
Boolean noNotices = cmd.hasOption("no-notices");
|
Boolean noNotices = cmd.hasOption("no-notices");
|
||||||
|
Boolean LogAsPDF = cmd.hasOption("log-as-pdf");
|
||||||
|
|
||||||
String zugferdVersion = cmd.getOptionValue("version");
|
String zugferdVersion = cmd.getOptionValue("version");
|
||||||
String zugferdProfile = cmd.getOptionValue("profile");
|
String zugferdProfile = cmd.getOptionValue("profile");
|
||||||
@@ -427,7 +431,7 @@ public class Main {
|
|||||||
performUBL(sourceName, outName);
|
performUBL(sourceName, outName);
|
||||||
optionsRecognized = true;
|
optionsRecognized = true;
|
||||||
} else if ((action != null) && (action.equals("validate"))) {
|
} else if ((action != null) && (action.equals("validate"))) {
|
||||||
optionsRecognized = performValidate(sourceName, noNotices, cmd.getOptionValue("logAppend"));
|
optionsRecognized = performValidate(sourceName, noNotices, cmd.getOptionValue("logAppend"), LogAsPDF);
|
||||||
} else if ((action != null) && (action.equals("validateExpectValid"))) {
|
} else if ((action != null) && (action.equals("validateExpectValid"))) {
|
||||||
optionsRecognized = performValidateExpect(true, directoryName);
|
optionsRecognized = performValidateExpect(true, directoryName);
|
||||||
} else if ((action != null) && (action.equals("validateExpectInvalid"))) {
|
} else if ((action != null) && (action.equals("validateExpectInvalid"))) {
|
||||||
@@ -454,7 +458,7 @@ public class Main {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean performValidate(String sourceName, boolean noNotices, String logAppend) {
|
private static boolean performValidate(String sourceName, boolean noNotices, String logAppend, boolean createLogAsPDF) {
|
||||||
boolean optionsRecognized;
|
boolean optionsRecognized;
|
||||||
if (sourceName == null) {
|
if (sourceName == null) {
|
||||||
sourceName = getFilenameFromUser("Source PDF or XML", "invoice.pdf", "pdf|xml", true, false);
|
sourceName = getFilenameFromUser("Source PDF or XML", "invoice.pdf", "pdf|xml", true, false);
|
||||||
@@ -466,7 +470,16 @@ public class Main {
|
|||||||
if (noNotices) {
|
if (noNotices) {
|
||||||
zfv.disableNotices();
|
zfv.disableNotices();
|
||||||
}
|
}
|
||||||
System.out.println(zfv.validate(sourceName));
|
|
||||||
|
String validationResultXML = zfv.validate(sourceName);
|
||||||
|
System.out.println(validationResultXML);
|
||||||
|
|
||||||
|
if( createLogAsPDF) {
|
||||||
|
ValidationLogVisualizer vlvi = new ValidationLogVisualizer();
|
||||||
|
String fileBasename = FilenameUtils.getBaseName(sourceName);
|
||||||
|
|
||||||
|
vlvi.toPDF(validationResultXML, fileBasename + "_result.pdf");
|
||||||
|
}
|
||||||
optionsRecognized = !zfv.hasOptionsError();
|
optionsRecognized = !zfv.hasOptionsError();
|
||||||
if (!zfv.wasCompletelyValid()) {
|
if (!zfv.wasCompletelyValid()) {
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
|
|||||||
@@ -0,0 +1,148 @@
|
|||||||
|
package org.mustangproject.ZUGFeRD;
|
||||||
|
|
||||||
|
import org.apache.fop.apps.*;
|
||||||
|
import org.apache.fop.apps.io.ResourceResolverFactory;
|
||||||
|
import org.apache.fop.configuration.Configuration;
|
||||||
|
import org.apache.fop.configuration.ConfigurationException;
|
||||||
|
import org.apache.fop.configuration.DefaultConfigurationBuilder;
|
||||||
|
import org.apache.xmlgraphics.util.MimeConstants;
|
||||||
|
import org.mustangproject.ClasspathResolverURIAdapter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.xml.transform.*;
|
||||||
|
import javax.xml.transform.sax.SAXResult;
|
||||||
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
import javax.xml.transform.stream.StreamSource;
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
public class ValidationLogVisualizer {
|
||||||
|
public enum Language {
|
||||||
|
EN,
|
||||||
|
FR,
|
||||||
|
DE
|
||||||
|
}
|
||||||
|
|
||||||
|
static final ClassLoader CLASS_LOADER = ValidationLogVisualizer.class.getClassLoader();
|
||||||
|
private static final String RESOURCE_PATH = "";
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(ValidationLogVisualizer.class);
|
||||||
|
|
||||||
|
private TransformerFactory mFactory = null;
|
||||||
|
private Templates mXsltPDFTemplate = null;
|
||||||
|
|
||||||
|
|
||||||
|
public ValidationLogVisualizer() {
|
||||||
|
mFactory = new net.sf.saxon.TransformerFactoryImpl();
|
||||||
|
// fact = TransformerFactory.newInstance();
|
||||||
|
mFactory.setURIResolver(new ValidationLogVisualizer.ClasspathResourceURIResolver());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void applyXSLTToPDF(final String xmlContent, final OutputStream PDFOutstream)
|
||||||
|
throws TransformerException {
|
||||||
|
Transformer transformer = mXsltPDFTemplate.newTransformer();
|
||||||
|
|
||||||
|
transformer.transform(new StreamSource(new StringReader(xmlContent)), new StreamResult(PDFOutstream));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String toFOP(final String xmlContent)
|
||||||
|
throws TransformerException {
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (mXsltPDFTemplate == null) {
|
||||||
|
mXsltPDFTemplate = mFactory.newTemplates(
|
||||||
|
new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/result-pdf.xsl")));
|
||||||
|
}
|
||||||
|
} catch (TransformerConfigurationException ex) {
|
||||||
|
LOGGER.error("Failed to init XSLT templates", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
applyXSLTToPDF(xmlContent, baos);
|
||||||
|
|
||||||
|
} catch (Exception e1) {
|
||||||
|
LOGGER.error("Failed to create PDF", e1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return baos.toString(StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toPDF(String xmlLogfileContent, String pdfFilename) {
|
||||||
|
|
||||||
|
// the writing part
|
||||||
|
|
||||||
|
String result = null;
|
||||||
|
|
||||||
|
/* remove file endings so that tests can also pass after checking
|
||||||
|
out from git with arbitrary options (which may include CSRF changes)
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
result = this.toFOP(xmlLogfileContent);
|
||||||
|
} catch ( TransformerException e) {
|
||||||
|
LOGGER.error("Failed to apply FOP", e);
|
||||||
|
}
|
||||||
|
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
|
||||||
|
|
||||||
|
Configuration cfg = null;
|
||||||
|
try {
|
||||||
|
cfg = cfgBuilder.build(CLASS_LOADER.getResourceAsStream("fop-config.xconf"));
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
FopFactoryBuilder builder = new FopFactoryBuilder(new File(".").toURI(), new ClasspathResolverURIAdapter()).setConfiguration(cfg);
|
||||||
|
// Step 1: Construct a FopFactory by specifying a reference to the configuration file
|
||||||
|
// (reuse if you plan to render multiple documents!)
|
||||||
|
|
||||||
|
FopFactory fopFactory = builder.build();
|
||||||
|
|
||||||
|
fopFactory.getFontManager().setResourceResolver(
|
||||||
|
ResourceResolverFactory.createInternalResourceResolver(
|
||||||
|
new File(".").toURI(),
|
||||||
|
new ClasspathResolverURIAdapter()));
|
||||||
|
|
||||||
|
FOUserAgent userAgent = fopFactory.newFOUserAgent();
|
||||||
|
|
||||||
|
userAgent.getRendererOptions().put("pdf-a-mode", "PDF/A-3b");
|
||||||
|
|
||||||
|
// Step 2: Set up output stream.
|
||||||
|
// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams).
|
||||||
|
|
||||||
|
try (OutputStream out = new BufferedOutputStream(new FileOutputStream(pdfFilename))) {
|
||||||
|
|
||||||
|
// Step 3: Construct fop with desired output format
|
||||||
|
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, userAgent, out);
|
||||||
|
|
||||||
|
// Step 4: Setup JAXP using identity transformer
|
||||||
|
TransformerFactory factory = TransformerFactory.newInstance();
|
||||||
|
Transformer transformer = factory.newTransformer(); // identity transformer
|
||||||
|
|
||||||
|
// Step 5: Setup input and output for XSLT transformation
|
||||||
|
// Setup input stream
|
||||||
|
Source src = new StreamSource(new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8)));
|
||||||
|
|
||||||
|
// Resulting SAX events (the generated FO) must be piped through to FOP
|
||||||
|
Result res = new SAXResult(fop.getDefaultHandler());
|
||||||
|
|
||||||
|
// Step 6: Start XSLT transformation and FOP processing
|
||||||
|
transformer.transform(src, res);
|
||||||
|
|
||||||
|
} catch (FOPException | IOException | TransformerException e) {
|
||||||
|
LOGGER.error("Failed to create PDF", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ClasspathResourceURIResolver implements URIResolver {
|
||||||
|
ClasspathResourceURIResolver() {
|
||||||
|
// Do nothing, just prevents synthetic access warning.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Source resolve(String href, String base) throws TransformerException {
|
||||||
|
return new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/" + href));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
203
library/src/main/resources/stylesheets/result-pdf.xsl
Normal file
203
library/src/main/resources/stylesheets/result-pdf.xsl
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<xsl:stylesheet xmlns:fo="http://www.w3.org/1999/XSL/Format"
|
||||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||||
|
xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
|
||||||
|
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||||
|
version="2.0">
|
||||||
|
<!-- ==========================================================================
|
||||||
|
== Imports
|
||||||
|
=========================================================================== -->
|
||||||
|
<xsl:import href="common-xr.xsl"/>
|
||||||
|
|
||||||
|
<xsl:import href="xr-pdf/lib/konstanten.xsl"/>
|
||||||
|
|
||||||
|
<!-- FO engine used can be specified. Specific extensions will be then enabled.
|
||||||
|
Supported values are:
|
||||||
|
axf - Antenna House XSL Formatter
|
||||||
|
fop - Apache FOP
|
||||||
|
-->
|
||||||
|
<xsl:param name="foengine"/>
|
||||||
|
|
||||||
|
<xsl:param name="axf.extensions" select="if ($foengine eq 'axf') then true() else false()"/>
|
||||||
|
<xsl:param name="fop.extensions" select="if ($foengine eq 'fop') then true() else false()"/>
|
||||||
|
|
||||||
|
|
||||||
|
<xsl:variable name="xml_result_color">
|
||||||
|
<xsl:if test="/validation/xml/summary/@status = 'valid' ">
|
||||||
|
<xsl:text>green</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:if test="/validation/xml/summary/@status = 'invalid' ">
|
||||||
|
<xsl:text>red</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
</xsl:variable>
|
||||||
|
|
||||||
|
<xsl:variable name="pdf_result_color">
|
||||||
|
<xsl:if test="/validation/pdf/summary/@status = 'valid' ">
|
||||||
|
<xsl:text>green</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:if test="/validation/pdf/summary/@status = 'invalid' ">
|
||||||
|
<xsl:text>red</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
</xsl:variable>
|
||||||
|
|
||||||
|
<xsl:variable name="pdf_result_text">
|
||||||
|
<xsl:if test="/validation/xml/summary/@status = 'valid' ">
|
||||||
|
<xsl:text>Das ZUGFeRD-PDF ist valide.</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:if test="/validation/xml/summary/@status = 'invalid' ">
|
||||||
|
<xsl:text>Das ZUGFeRD-PDF ist nicht valide.</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
</xsl:variable>
|
||||||
|
|
||||||
|
<xsl:variable name="result_text">
|
||||||
|
<xsl:if test="/validation/xml/summary/@status = 'valid' ">
|
||||||
|
<xsl:text>Es wird empfohlen das Dokument anzunehmen und weiter zu verarbeiten.</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:if test="/validation/xml/summary/@status = 'invalid' ">
|
||||||
|
<xsl:text>Es wird empfohlen das Dokument zurückzuweisen.</xsl:text>
|
||||||
|
</xsl:if>
|
||||||
|
</xsl:variable>
|
||||||
|
|
||||||
|
<xsl:template match="validation">
|
||||||
|
<fo:root xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf"
|
||||||
|
language="{$lang}" font-family="{$fontSans}">
|
||||||
|
<fo:layout-master-set>
|
||||||
|
<fo:simple-page-master master-name="DIN-A4" page-height="297mm" page-width="210mm">
|
||||||
|
<fo:region-body region-name="body" margin="20mm 10mm 20mm 20mm" />
|
||||||
|
</fo:simple-page-master>
|
||||||
|
</fo:layout-master-set>
|
||||||
|
|
||||||
|
<fo:page-sequence master-reference="DIN-A4">
|
||||||
|
<fo:flow flow-name="body">
|
||||||
|
<fo:block font-size="24px" font-weight="bold">
|
||||||
|
Prüfbericht
|
||||||
|
</fo:block>
|
||||||
|
|
||||||
|
<xsl:call-template name="SubHeader">
|
||||||
|
<xsl:with-param name="text" select='"Angaben zum geprüften Dokument"' />
|
||||||
|
<xsl:with-param name="color" select='"black"' />
|
||||||
|
</xsl:call-template>
|
||||||
|
|
||||||
|
<fo:block>
|
||||||
|
<fo:block text-align="justify">
|
||||||
|
<fo:float float="right">
|
||||||
|
<fo:block >
|
||||||
|
<xsl:value-of select="/validation/@filename" />
|
||||||
|
</fo:block>
|
||||||
|
</fo:float>
|
||||||
|
Referenz:
|
||||||
|
</fo:block>
|
||||||
|
</fo:block>
|
||||||
|
<fo:block>
|
||||||
|
<fo:block text-align="justify">
|
||||||
|
<fo:float float="right">
|
||||||
|
<fo:block >
|
||||||
|
<xsl:value-of select="/validation/@datetime" />
|
||||||
|
</fo:block>
|
||||||
|
</fo:float>
|
||||||
|
Zeitpunkt der Prüfung:
|
||||||
|
</fo:block>
|
||||||
|
</fo:block>
|
||||||
|
<fo:block>
|
||||||
|
<fo:block text-align="justify">
|
||||||
|
<fo:float float="right">
|
||||||
|
<fo:block >
|
||||||
|
<xsl:value-of select="/validation/xml/info/profile" />
|
||||||
|
</fo:block>
|
||||||
|
</fo:float>
|
||||||
|
Erkannter Dokumenttyp:
|
||||||
|
</fo:block>
|
||||||
|
</fo:block>
|
||||||
|
|
||||||
|
<xsl:apply-templates select="/validation/pdf" />
|
||||||
|
|
||||||
|
<!--<xsl:call-template name="SubHeader" >
|
||||||
|
<xsl:with-param name="text" select='"Konformitätsprüfung:"' />
|
||||||
|
<xsl:with-param name="color" select='"black"' />
|
||||||
|
</xsl:call-template>-->
|
||||||
|
|
||||||
|
<xsl:call-template name="SubHeader" >
|
||||||
|
<xsl:with-param name="text" select="concat('Bewertung: ', $result_text)" />
|
||||||
|
<xsl:with-param name="color" select="$xml_result_color" />
|
||||||
|
</xsl:call-template>
|
||||||
|
|
||||||
|
<fo:block>Validierungsergebnisse im Detail:</fo:block>
|
||||||
|
|
||||||
|
<fo:table>
|
||||||
|
<fo:table-column border-style="solid" />
|
||||||
|
<fo:table-column border-style="solid" />
|
||||||
|
<fo:table-column column-width="70%" border-style="solid" />
|
||||||
|
<fo:table-header>
|
||||||
|
<fo:table-row background-color="#E0E0E0" font-weight="bold">
|
||||||
|
<fo:table-cell>
|
||||||
|
<fo:block>Type</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
<fo:table-cell>
|
||||||
|
<fo:block>Code</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
<fo:table-cell>
|
||||||
|
<fo:block>Text</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
</fo:table-row>
|
||||||
|
</fo:table-header>
|
||||||
|
<fo:table-body>
|
||||||
|
<xsl:apply-templates select="/validation/xml/messages" />
|
||||||
|
</fo:table-body>
|
||||||
|
</fo:table>
|
||||||
|
|
||||||
|
</fo:flow>
|
||||||
|
</fo:page-sequence>
|
||||||
|
</fo:root>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template match="notice">
|
||||||
|
<fo:table-row font-size="12px" border-style="solid">
|
||||||
|
<fo:table-cell number-rows-spanned="2">
|
||||||
|
<fo:block>
|
||||||
|
<xsl:value-of select="@type" />
|
||||||
|
</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
<fo:table-cell number-rows-spanned="2">
|
||||||
|
<fo:block>
|
||||||
|
<xsl:call-template name="SUBID" >
|
||||||
|
<xsl:with-param name="myparam" select="substring-after(.,' [ID ')" />
|
||||||
|
</xsl:call-template>
|
||||||
|
</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
<fo:table-cell>
|
||||||
|
<fo:block>
|
||||||
|
<xsl:value-of select="substring-before(.,' [ID')" />
|
||||||
|
</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
</fo:table-row>
|
||||||
|
<fo:table-row font-size="12px" border-style="solid">
|
||||||
|
<fo:table-cell>
|
||||||
|
<fo:block>Pfad:
|
||||||
|
<xsl:value-of select="@location" />
|
||||||
|
</fo:block>
|
||||||
|
</fo:table-cell>
|
||||||
|
</fo:table-row>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template match="pdf">
|
||||||
|
<xsl:call-template name="SubHeader" >
|
||||||
|
<xsl:with-param name="text" select="concat('ZUGFeRD-PDF: ', $pdf_result_text)" />
|
||||||
|
<xsl:with-param name="color" select='"black"' />
|
||||||
|
</xsl:call-template>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template name="SubHeader">
|
||||||
|
<xsl:param name="text" />
|
||||||
|
<xsl:param name="color" />
|
||||||
|
<fo:block color="{$color}" background-color="#E0E0E0" margin-bottom="10px" padding="3px" font-weight="bold" margin-top="10px">
|
||||||
|
<xsl:value-of select="$text" />
|
||||||
|
</fo:block>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template name="SUBID">
|
||||||
|
<xsl:param name="myparam" />
|
||||||
|
<xsl:variable name="myparam.end" select="substring-before($myparam, ']')"/>
|
||||||
|
<xsl:value-of select="$myparam.end"/>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
</xsl:stylesheet>
|
||||||
Reference in New Issue
Block a user