2012-02-27 8 views
3

おやすみ!私はxsl-foテンプレートを書く必要がありますが、ソースXMLにアクセスすることはできません。ソースXMLをPDFに印刷して、PDFからコピーしてファイルに貼り付ける方法はありますか?属性を含むソースxmlと同じ構造を持つ必要があります。どうすればいいですか?前もって感謝します! VojtechXSL-FOを使用してソースXMLをPDFに印刷する方法は?

編集:テンプレートを貼り付けることができるWebインターフェイスがあり、PDFが生成されています。しかし、私はデータソースとして使われるXMLの構造が何であるか正確には分かりません。ですから、入力XML(要素、属性、構造)を読み込んでPDFに書き込む別のテンプレートを書く必要があります。 PDFの内容をコピーしてfile.xmlに保存して、私が勉強できるようにしたいと思います。

+0

私はあなたがそれを印刷したいんか、あなたは元のXMLを持っていなかったと思いましたか?私はその質問を理解していない。 – mindandmedia

答えて

3

ここで大幅に簡素化され、別のオプションがありますが、 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)

enter image description here

2

Hereソース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> 
関連する問題