我刚开始学习XSLT,现在我正在学习它的一些在线教程,我现在只有一个简单的问题:
假设我们有一个原始的xml文件,我们是否需要编写一个XSLT样式表来处理它,或者我们只是简单地将xml文件传递给某些软件,如Stylus Studio(Saxon Engine),那么它将完成所有这些我们会自动为你做什么?
很抱歉澄清错误。我需要将此.svg文件转换为pdf,我刚刚开始开发,所以真的很困惑第一步。另外,我想知道,如果我的初始输入是.svg文件,在开始使用XSLT之前,是否必须将其显式转换为.xml?
提前致谢!
答案 0 :(得分:8)
很抱歉澄清错误。我需要将此.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格式化对象处理器),但他听起来像FOP和XSL-FO是一样的;他们不是。他的代码示例是一个XSL-FO表(fo
命名空间中的XML)。您需要一个处理器,如FOP,RenderX,Antenna House等,才能从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图形。
备注强>
同时强>
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>
希望这有帮助。
答案 1 :(得分: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作为参数
答案 2 :(得分:-1)
Svg是一个Xml文件。因此,您可以开始编写自己的XSLT样式表,将其转换为所需的格式。
但是对Google的快速搜索向我展示了很多可以为你做这种转换的程序。