【问题标题】:a beginner question on XSLT一个关于 XSLT 的初学者问题
【发布时间】:2011-05-06 12:14:23
【问题描述】:

我刚开始学习 XSLT,现在我正在关注它的一些在线教程,我现在只有一个简单的问题:

假设我们有一个原始的 xml 文件,我们是否需要编写一个 XSLT 样式表来配合它,或者我们只是简单地将 xml 文件传递​​给一些软件,如 Stylus Studio(Saxon Engine),那么它会做所有这些自动为我们服务?

很抱歉,我需要将这个 .svg 文件转换为 pdf,我才刚刚开始开发,所以对第一步真的很困惑。另外,我想知道,如果我的初始输入是一个 .svg 文件,是否必须将其显式转换为 .xml 才能开始使用 XSLT?

提前致谢!

【问题讨论】:

  • 这取决于你想要做什么。您对 XSLT 样式表有什么期望,应该发生什么转换?
  • 这个问题有点不清楚。你期待的结果是什么?你用 XSLT 做什么?

标签: xslt xsl-fo saxon


【解决方案1】:

很抱歉,我需要将这个 .svg 文件转换为 pdf,我才刚刚开始开发,所以对第一步真的很困惑。另外,我想知道,如果我的初始输入是一个 .svg 文件,我是否必须在开始使用 XSLT 之前将其显式转换为 .xml?

SVG 文件 SVG 命名空间中的 XML 文件。是否需要转换 XML 取决于您将如何使用它。如果您打算使用 Inkscape(一种 SVG 编辑器)之类的工具进行批量打印,则不会。

如果你打算使用 XSL-FO 之类的东西,你会的。 @Zoltan Hamori 的回答有点误导。您可以使用 saxon 执行 XSLT 转换(创建 XSL-FO),但您仍然需要 XSL-FO 处理器才能从 XSL-FO 创建 PDF。

Zoltan 提到了 FOP(Apache Formatting Objects Processor),但他听起来好像 FOP 和 XSL-FO 是一样的;他们不是。他的代码示例是一个 XSL-FO 表(fo 命名空间中的 XML)。您需要 FOP、RenderX、Antenna House 等处理器来从 XSL-FO 创建 PDF。

基本上你需要的是:

  1. XML 输入(这将是您的 SVG 文件)
  2. XSLT 转换以创建 XSL-FO。
  3. XSL-FO 处理器从 XSL-FO 创建 PDF

在学习 XSLT 的同时学习 XSL-FO 会很困难,但我将向您展示两种在 PDF 中输出 SVG 的方法。

第一种方法是使用fo:external-graphic引用SVG文件。

第二种方法是使用fo:instream-foreign-object 将SVG XML 直接嵌入到XSL-FO 中。

由于 XML 输入是 SVG XML,我会选择第二个选项。但是,我不确定这对处理时间有什么影响以及哪种方式更有效。

我在下面展示了一个示例。由于我展示了两种输出 SVG 的方法,这将创建一个 2 页的 PDF。每个页面都有 SVG 图形。

备注

  • 为了进行测试,我使用了 Inkscape 附带的示例 SVG 文件。 (我从 XSL-FO 输出中删除了大部分 SVG XML,因为它非常大。)
  • 对于我的 XSLT 处理器,我使用了 Saxon-HE 9.2.0.6。
  • 对于我的 FO 处理器,我使用了 Apache FOP 版本 0.95(尽管我更喜欢 RenderX)。

还有

  • Saxon-HE 和 Apache FOP 都是免费的。
  • 如果您给我您的电子邮件,我可以将我使用的 SVG 文件连同完整的 XSL-FO 输出一起发送给您。我还可以将创建的 PDF 发送给您。

XSLT 2.0

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

  <!-- 
    This is an "identity" template.
    It copies whatever node from input to the output without changing it. 
    Learn it. Use it. Love it. -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="my-page">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="my-page">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>
            <!-- This is the first way to output an SVG; by referencing the graphic. -->
            <fo:external-graphic src="test.svg"/>
            <!-- This is the second way to output an SVG; by outputting the SVG XML directly. -->
            <fo:instream-foreign-object>
              <xsl:apply-templates/>
            </fo:instream-foreign-object>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

</xsl:stylesheet>

XSL-FO(由 Saxon 根据 SVG 输入和 XSL 样式表创建)

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="my-page">
         <fo:region-body/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="my-page">
      <fo:flow flow-name="xsl-region-body">
         <fo:block>
            <fo:external-graphic src="test.svg"/>
            <fo:instream-foreign-object>
              <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
                    version="1.1"
                    width="595.99438"
                    height="491.50516"
                    id="svg2675">
                <!-- CONTENT REMOVED FOR STACKOVERFLOW.COM EXAMPLE -->
              </svg>
            </fo:instream-foreign-object>
         </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

希望这会有所帮助。

【讨论】:

  • 非常感谢,DevNull,你能把你的 svg 发邮件给我吗?谢谢。我的电子邮件是 thuderfan@live.com。
  • 另外,我有一个问题,您提供的 XSL 样式表和 XSL-FO 是否适用于所有 svg 文件,还是仅适用于您的特定 svg 文件?谢谢
  • @Robert - XSL 样式表应该适用于所有 svg 文件。我会删除fo:external-graphic。如果您确实想使用fo:external-graphic 而不是fo:instream-foreign-object,则必须将svg 文件名作为参数传递。我会将 svg 和完整的 XSL-FO 文件通过电子邮件发送给您。
【解决方案2】:

如果您想将数据转换为 PDF,您可以使用 XSL:FO/FOP。您需要一个可转换为 PDF 的 xsl 文件的 FOP 模板。此 xsl 文件可以引用 XML、图像文件等外部对象,或者您可以使用 freemarker/velocity 将数据放入 XSL 模板中。

您可以找到更多信息: http://www.treebuilder.de/svg/extentSVG/artikel/tut.html

如果你使用 FOP 标签,你可以像这样引用 SVG 文件:

   <fo:table text-align="left" table-layout="fixed"
                                      background-image="SVG_file.svg">

我认为可以将svg文件作为参数添加到saxon

【讨论】:

  • 假设现在我要在java中使用Saxon来做这个转换,我应该把你理解为svg文件作为输入xml,将上述FOP模板理解为Saxon命令中的xml吗?跨度>
【解决方案3】:

Svg 是一个 Xml 文件。因此,您可以开始编写自己的 XSLT 样式表以将其转换为所需的格式。

但是在Google 上的快速搜索向我展示了许多可以为您进行这种转换的程序。

【讨论】:

  • 不,如果您只想将 svg 转换为 pdf,请尝试使用搜索引擎(例如 Google)搜索可以进行此转换的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多