-1

我有以下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
4

1 回答 1

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>•&lt;/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>•&lt;/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>•&lt;/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().

于 2012-07-27T03:16:06.060 回答