0

我有一个 XHTML 模板。我想从 XHTML 模板创建一个 XSL FO。如何将 XHTML 转换为 XSLFO?我通过使用 XHTML 文件的字符串替换来创建 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>
4

2 回答 2

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 工具一起使用。

于 2013-03-27T10:12:17.190 回答
0

This has worked for me:

        //
        // 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
        }
于 2013-02-12T14:03:25.613 回答