Xslt到xsl-fo转换

时间:2012-02-25 18:18:37

标签: xml xslt xsl-fo

我想对xsl-fo进行xslt转换,但我不确定我能做到这一点。我尝试将XML列表转换为xsl-fo列表。任何人都可以告诉我在哪里可以寻找我谷歌搜索很长一段时间没有很多这样的例子。我的XML是这样的。

 <p>TEXT</p>
 <ul>
   <li>Item1</li>
   <li>Item2</li>
 </ul>
 <p>ANOTHERTEXT</p>

我尝试使用模板进行此转换,但我的模板不能用于获取xsl-fo任何人都可以告诉我模板是否适用于此转换。如果他们工作可以告诉我一个例子,我找不到任何人。我的目标是获得一个pdf whit fop

由于


这是我的XML文档的一部分我在HTML中收集了源代码的一些部分,并且我将HTML更改为XML,现在我尝试将XML(在列表中)转换为XSL-FO,然后将其转换为XSLT。我的问题是我无法为这种转变提供模板。我最后的目标是获得一个pdf whit FOP。

由于

更新

这是我的XML:

<Memoria>
  <name>TITLE</name>
  <Index>INDEX 2010</Index>
  <Seccion>
     <name>INFORMATION</name>
     <Contenido>
       <p>TEXT</p>
       <ul>
     <li>ITEM1</li>
     <li>ITEM2</li>
      </ul>
      <p>ANOTHER</p>
    </Contenido>
  </Seccion>
</Memoria>

我正在测试你的解决方案谢谢大家

2 个答案:

答案 0 :(得分:6)

如果您的模板出现问题,则可能是命名空间问题。您应该使用更准确的XML示例更新问题。

这是一个例子。

XML输入(已修复为格式良好)

<root>
  <p>TEXT</p>
  <ul>
    <li>Item1</li>
    <li>Item2</li>
  </ul>
  <p>ANOTHERTEXT</p>  
</root>

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

  <xsl:template match="p">
    <fo:block>
      <xsl:apply-templates/>
    </fo:block>
  </xsl:template>

  <xsl:template match="ul">
    <fo:list-block padding="4pt">
      <xsl:apply-templates/>
    </fo:list-block>
  </xsl:template>

  <xsl:template match="li">
    <fo:list-item>
      <fo:list-item-label end-indent="label-end()">
        <fo:block>&#x02022;</fo:block>
      </fo:list-item-label>
      <fo:list-item-body start-indent="body-start()">
        <fo:block>
          <xsl:apply-templates/>
        </fo:block>
      </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:block>TEXT</fo:block>
         <fo:list-block padding="4pt">
            <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>Item1</fo: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>Item2</fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </fo:list-block>
         <fo:block>ANOTHERTEXT</fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

Apache FOP输出

enter image description here

答案 1 :(得分:0)

首先,确保您有一个xhtml文件(没有&lt; br&gt;等)。然后应用xslt转换来创建fo文件,然后将其提供给fop并显示pdf。

xslt fo样式片段:

  <xsl:template match="html:body">
    <fo:page-sequence master-reference="all-pages">
      <fo:title>
        <xsl:value-of select="/html:html/html:head/html:title"/>
      </fo:title>
      <fo:static-content flow-name="page-header">
        <fo:block  font-weight="bold" font-size="16pt" space-before.conditionality="retain" xsl:use-attribute-sets="page-header"><!--  space-before="{$page-header-margin}"  -->
          <xsl:if test="$title-print-in-header = 'true'">
            <xsl:value-of select="/html:html/html:head/html:title"/>
          </xsl:if>
        </fo:block>
      </fo:static-content>
    </fo:page-sequence>
  </xsl:template>

检查http://www.w3schools.com/xslfo/default.asp是否有xslfo语法。

有关运行fop的信息,请参阅http://xmlgraphics.apache.org/fop/trunk/running.html; fop.jar的下载必须在附近。

从vba运行,例如如下:

Set shell = CreateObject("WScript.Shell")
    cmd = "java -Dfop.home=" & baseDir & " -cp " & baseDir & "build\fop.jar org.apache.fop.cli.Main -fo " & foName & " -pdf " & pdfName
Call shell.Run(cmd, vbWindowFrame, True)

(类似于命令行)