我有一个XHTML模板。 我想从XHTML模板创建一个XSL FO。 如何将XHTML转换为XSLFO? 我通过使用XHTML File的字符串替换创建了XSL FO。 是否可以为模板创建XSL FO而不使用字符串替换? 下面是我的XHTML模板。
< div>
{:header:}{:date:}
< p>
{:mailingattn:} < br />
{:facilityname:} < br />
{:facilitystreet:} < br />
{:facilitystreet2:} <br />
{:facilitycity:}, {:facilitystate:} {:facilityzip:} < br />
{:facilitycountry:}
< /p>
< br />
< p>abcd,</p>
< p>The Department of abcd:< /p>
< p>{:checkreturnreason:}< /p>
< p>{:message:}< /p>
< pnext>If you have any questions or need assistance, please feel free to abcd:< /pnext>
< pnext>Sincerely, <br />
{:signature:}
< /pnext>
{:footer:}
< /div>
预定义的XSL FO模板
< xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
< xsl:output method="xml"/>
< !--
expects a rootpath attribute in one of the tags. this should correspond to the
physical path of the apps folder without the ending slash
-->
< xsl:variable name="rootpath"
select="//@rootpath" />
< xsl:template match="/">
< xsl:apply-templates/>
< /xsl:template>
< xsl:template match="div">
< xsl:apply-templates/>
< /xsl:template>
< xsl:template match="img">
< fo:external-graphic height="auto" width="auto">
< xsl:attribute name="src">
< xsl:value-of select="concat($rootpath, substring-after(@src,'../..'))" />
< /xsl:attribute>
< /fo:external-graphic>
< /xsl:template>
< xsl:template match="xsl:value-of">
< xsl:copy-of select="." />
< /xsl:template>
< xsl:template match="br">
< fo:block>
< /fo:block>
< /xsl:template>
< xsl:template match="p">
< fo:block space-before="8pt" space-after="4pt">
< xsl:apply-templates/>
< /fo:block>
< /xsl:template>
< xsl:template match="pnext">
< fo:block keep-with-next="always" space-before="8pt" space-after="4pt">
< xsl:apply-templates/>
< /fo:block>
< /xsl:template>
< xsl:template match="table">
< fo:table width="100%" font-family="Arial">
< fo:table-body>
< xsl:for-each select="tr">
< fo:table-row>
< xsl:for-each select="td">
< xsl:variable name="width">
< xsl:value-of select="@width"/>
< /xsl:variable>
< fo:table-cell padding-top='4pt' width="{$width}">
< xsl:for-each select="span">
< xsl:variable name="fsize">
< xsl:value-of select="@size"/>
< /xsl:variable>
< fo:block font-size="{$fsize}pt" text-align="right">
< xsl:apply-templates/>
< /fo:block>
< /xsl:for-each>
< /fo:table-cell>
< /xsl:for-each>
< /fo:table-row>
< /xsl:for-each>
< fo:table-row>
< fo:table-cell border=".2pt solid black">
< /fo:table-cell>
< fo:table-cell border=".2pt solid black">
< /fo:table-cell>
< /fo:table-row>
< /fo:table-body>
< /fo:table>
< /xsl:template>
< /xsl:stylesheet>
答案 0 :(得分:1)
http://www.ibm.com/developerworks/xml/library/x-xslfo2app/index.html
有一个全面的XSLT将XHTML转换为XSL-FO
摘要:需要帮助将HTML文档转换为PDF?本参考指南通过示例演示如何使用XSLT模板将45个常用HTML元素转换为格式化对象(来自XSL-FO词汇表),以便使用XSLT轻松转换为PDF。这些示例假设您使用的是Apache XML Project的FOP工具,但大多数方法与其他XSL-FO工具一样。
答案 1 :(得分:0)
这对我有用:
//
// Transform well-stuctured XHTML into XSL-FO.
//
var trans = new XslCompiledTransform();
var xml = new MemoryStream();
XmlWriter writer = new XmlTextWriter(xml, System.Text.Encoding.Default);
var converterStream = File.Open("YourXsl.xsl");
trans.Load(new XmlTextReader(converterStream));
// Load XHTML
var html = File.Open("YourHtml.html");
var outputStream = new MemoryStream(Encoding.ASCII.GetBytes(viewOutput));
outputStream.Position = 0;
using (var input = new XmlTextReader(outputStream)) {
// Transform XHTML to XSL-FO
trans.Transform(input, writer);
writer.Flush();
xml.Position = 0;
// Do something with your XSL-FO
}