2012-07-26 54 views
-1

相同的XML结构,我有以下XML结构:保留对XSL-FO

<xml> 
    <node level="1" companyname="A"> 
     <node level="2" companyname="b"></node> 
    </node> 
    <node level="1" companyname="c"> 
</node> 

我需要申请XSL-FO改造,以获得PDF格式输出。不过,我需要保留XML数据的格式。请告诉我如何做到这一点。

这是所需的输出:

  • Ç

回答

1

如果“我需要保存的格式XML数据“。意味着您需要保留层次结构,那么您应该可以使用基本列表。

这个非常简单的例子应该让你开始...

XML输入(修改为合格的)

<xml> 
    <node level="1" companyname="A"> 
     <node level="2" companyname="b"/> 
    </node> 
    <node level="1" companyname="c"/> 
</xml> 

XSLT 1.0

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

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/xml"> 
     <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"> 
        <fo:list-block> 
         <xsl:apply-templates/> 
        </fo:list-block> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="node"> 
     <fo:list-item> 
      <fo:list-item-label end-indent="label-end()"> 
       <fo:block>&#x2022;</fo:block> 
      </fo:list-item-label>   
      <fo:list-item-body start-indent="body-start()"> 
       <fo:block><xsl:value-of select="translate(@companyname,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/></fo:block> 
       <xsl:if test="node"> 
        <fo:list-block> 
         <xsl:apply-templates select="node"/> 
        </fo:list-block> 
       </xsl:if> 
      </fo:list-item-body> 
     </fo:list-item>  
    </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"> 
     <fo:list-block> 
      <fo:list-item> 
       <fo:list-item-label end-indent="label-end()"> 
        <fo:block>•</fo:block> 
       </fo:list-item-label> 
       <fo:list-item-body start-indent="body-start()"> 
        <fo:block>A</fo:block> 
        <fo:list-block> 
        <fo:list-item> 
         <fo:list-item-label end-indent="label-end()"> 
          <fo:block>•</fo:block> 
         </fo:list-item-label> 
         <fo:list-item-body start-indent="body-start()"> 
          <fo:block>B</fo:block> 
         </fo:list-item-body> 
        </fo:list-item> 
        </fo:list-block> 
       </fo:list-item-body> 
      </fo:list-item> 
      <fo:list-item> 
       <fo:list-item-label end-indent="label-end()"> 
        <fo:block>•</fo:block> 
       </fo:list-item-label> 
       <fo:list-item-body start-indent="body-start()"> 
        <fo:block>C</fo:block> 
       </fo:list-item-body> 
      </fo:list-item> 
     </fo:list-block> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

PDF输出(我用的XEP,但FOP应该产生相同的结果)

so_fo-pdf.png

此外,我不知道这是否是一个错字,但bc是输入中为小写字母,输出中为大写字母。如果您不必强迫大小写,则可以删除translate()。另外,如果您可以使用XSLT 2.0,则可以使用upper-case()而不是translate()

+0

这就是我一直在寻找的东西。非常感谢。案件是一个错字。无论哪种方式,我都可以。 – user1555899 2012-07-27 14:17:49

+0

@ user1555899 - 你非常欢迎。请点击旁边的复选标记来接受答案。谢谢! – 2012-07-27 14:43:10