为XSL-FO保留相同的xml结构

时间:2012-07-26 20:59:00

标签: xml xslt xsl-fo

我有以下XML结构:

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

我需要应用XSL-FO转换,以pdf格式获取输出。但是,我需要保留XML数据的格式。请告诉我如何做到这一点。

这是所需的输出:

  
      
  • 甲   
        
    •   
  •   
  • C
  •   

1 个答案:

答案 0 :(得分: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()