XSLT的初学者问题

4

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

假设我们有一个原始的XML文件,我们需要编写一个XSLT样式表来与之配合,还是只需将XML文件传递到像Stylus Studio(Saxon Engine)这样的软件中,然后它会自动完成所有这些事情?

对于我的描述不清楚表示抱歉。我需要将此.svg文件转换为.pdf文件,我现在正在开发的初期,因此对第一步感到非常困惑。另外,我想知道,如果我的初始输入是.svg文件,我是否必须明确地将其转换为.xml才能开始使用XSLT?

提前致谢!


2
这取决于您试图做什么。您对XSLT样式表有什么期望,需要进行什么转换? - flash
2
这个问题有点不清楚。你期望得到什么样的结果?你要用XSLT做什么? - vcsjones
3个回答

9
抱歉我的表述可能有误,我需要将这个.svg文件转换成.pdf文件,我现在处于开发的初期,对第一步非常困惑。另外,如果我的初始输入是一个.svg文件,那么我是否必须明确地将其转换为.xml文件才能开始使用XSLT呢?
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图形。
注: 1. 为了测试,我使用了Inkscape提供的一个示例SVG文件。(我从XSL-FO输出中删除了大部分SVG XML,因为它非常大。) 2. 对于我的XSLT处理器,我使用的是Saxon-HE 9.2.0.6。 3. 对于我的FO处理器,我使用的是Apache FOP Version 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样式表创建)

XSL-FO是一种用于描述页面格式的语言。它使用XML格式,并且可以通过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。谢谢! - Kevin
另外,我有一个问题,您提供的XSL样式表和XSL-FO是否适用于所有SVG文件,还是仅适用于您特定的SVG文件?谢谢。 - Kevin
@Robert - XSL样式表应该适用于所有svg文件。不过我会删除fo:external-graphic。如果你确实想使用fo:external-graphic而不是fo:instream-foreign-object,那么你需要将svg文件名作为参数传递。我会给你发送svg和完整的XSL-FO文件。 - Daniel Haley

1
如果您想将数据转换为PDF,可以使用XSL:FO/FOP。您需要一个FOP模板,它是一个xsl文件,并且可以转换为PDF。该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吗? - Kevin

-1

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

但是,在Google上进行快速搜索,会显示出许多可以为您执行此转换的程序。


不,如果您只想将svg转换为pdf,请尝试使用搜索引擎(例如Google)搜索可以进行此转换的程序。 - flash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接