-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ます。これを行う方法について教えてください。

これは望ましい出力です:

    • B
4

1 に答える 1

1

「XML データの形式を保持する必要がある」場合。階層を保持する必要があることを意味し、基本的なリストを使用できるはずです。

この非常に基本的な例から始める必要があります...

XML 入力(整形式に変更)

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

XSLT1.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 に答える