繁体   English   中英

如何使用XSL-FO将源XML打印成PDF?

[英]How to print source XML into a PDF using XSL-FO?

美好的一天! 我需要编写一个xsl-fo模板,但我无法访问源XML。 有没有办法将源XML打印成PDF,以便我可以从PDF中复制它然后粘贴到文件中? 它应该与源xml包含属性的结构相同。 请问怎么做? 先感谢您! Vojtech

编辑:我有一个Web界面,我可以粘贴我的模板,生成PDF。 但我并不确切知道用​​作数据源的XML的结构是什么。 所以我需要编写另一个模板来读取输入XML(元素,属性,结构)并将其写入PDF。 我想复制PDF的内容,然后将其保存到file.xml中,以便我可以研究它。

这是另一个大大简化的选项; 只打印整个XML的副本。

例:

XML输入

<doc attr="test">
  <a>Lorem ipsum dolor sit amet...</a>
  <b>
    <c>Lorem ipsum dolor sit amet...</c>
    <d>
      <e attr="another test"/>
      <f>Lorem ipsum dolor sit amet...</f>
    </d>
  </b>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
          <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="my-page">
        <fo:flow flow-name="xsl-region-body" font-family="monospace">
          <fo:block white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve">
            <xsl:text disable-output-escaping="yes">
              &lt;![CDATA[
            </xsl:text>
            <xsl:copy-of select="/*"/>
            <xsl:text disable-output-escaping="yes">
              ]]&gt;
            </xsl:text>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

</xsl:stylesheet>

XSL-FO输出

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
         <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="my-page">
      <fo:flow flow-name="xsl-region-body" font-family="monospace">
         <fo:block white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve">
              <![CDATA[
            <doc attr="test">
               <a>Lorem ipsum dolor sit amet...</a>
               <b>
                  <c>Lorem ipsum dolor sit amet...</c>
                  <d>
                     <e attr="another test"/>
                     <f>Lorem ipsum dolor sit amet...</f>
                  </d>
               </b>
            </doc>
              ]]>
            </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

PDF输出 (Apache FOP)

在此输入图像描述

在这里,您将找到一篇关于复制源XML的优秀文章。
我刚刚把它包装成一个简单的XSL-FO存根,所以完全归功于原作者 这是完整的片段:

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:template match="/">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
          <fo:layout-master-set>
            <fo:simple-page-master master-name="main">
              <fo:region-body margin="1in"/>
            </fo:simple-page-master>
          </fo:layout-master-set>

          <fo:page-sequence master-reference="main">
            <fo:flow flow-name="xsl-region-body">
              <fo:block text-align="left">
                <xsl:apply-templates mode="escape"/>
              </fo:block>
            </fo:flow>
          </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="*" mode="escape">
        <!-- Begin opening tag -->
        <xsl:text>&lt;</xsl:text>
        <xsl:value-of select="name()"/>

        <!-- Namespaces -->
        <xsl:for-each select="namespace::*">
            <xsl:text> xmlns</xsl:text>
            <xsl:if test="name() != ''">
                <xsl:text>:</xsl:text>
                <xsl:value-of select="name()"/>
            </xsl:if>
            <xsl:text>='</xsl:text>
            <xsl:call-template name="escape-xml">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
            <xsl:text>'</xsl:text>
        </xsl:for-each>

        <!-- Attributes -->
        <xsl:for-each select="@*">
            <xsl:text> </xsl:text>
            <xsl:value-of select="name()"/>
            <xsl:text>='</xsl:text>
            <xsl:call-template name="escape-xml">
                <xsl:with-param name="text" select="."/>
            </xsl:call-template>
            <xsl:text>'</xsl:text>
        </xsl:for-each>

        <!-- End opening tag -->
        <xsl:text>&gt;</xsl:text>

        <!-- Content (child elements, text nodes, and PIs) -->
        <xsl:apply-templates select="node()" mode="escape" />

        <!-- Closing tag -->
        <xsl:text>&lt;/</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text>&gt;</xsl:text>
    </xsl:template>

    <xsl:template match="text()" mode="escape">
        <xsl:call-template name="escape-xml">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template match="processing-instruction()" mode="escape">
        <xsl:text>&lt;?</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:text> </xsl:text>
        <xsl:call-template name="escape-xml">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
        <xsl:text>?&gt;</xsl:text>
    </xsl:template>

    <xsl:template name="escape-xml">
        <xsl:param name="text"/>
        <xsl:if test="$text != ''">
            <xsl:variable name="head" select="substring($text, 1, 1)"/>
            <xsl:variable name="tail" select="substring($text, 2)"/>
            <xsl:choose>
                <xsl:when test="$head = '&amp;'">&amp;amp;</xsl:when>
                <xsl:when test="$head = '&lt;'">&amp;lt;</xsl:when>
                <xsl:when test="$head = '&gt;'">&amp;gt;</xsl:when>
                <xsl:when test="$head = '&quot;'">&amp;quot;</xsl:when>
                <xsl:when test="$head = &quot;&apos;&quot;">&amp;apos;</xsl:when>
                <xsl:otherwise><xsl:value-of select="$head"/></xsl:otherwise>
            </xsl:choose>
            <xsl:call-template name="escape-xml">
                <xsl:with-param name="text" select="$tail"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM