关于XSLT的初学者问题
我刚开始学习XSLT,现在我正在学习一些关于XSLT的在线教程,现在我有一个简单的问题: 假设我们有一个原始的xml文件,我们是否需要编写一个XSLT样式表来配合它,或者我们只是简单地将xml文件传递到一些软件中,比如Stylus Studio(Saxon引擎),然后它会自动为我们做所有这些事情 很抱歉澄清错误。我需要将此.svg文件转换为pdf,我刚刚开始开发,所以对第一步感到非常困惑。另外,我想知道,如果我的初始输入是.svg文件,在开始使用XSLT之前,我是否必须显式将其转换为.xml关于XSLT的初学者问题,xslt,xsl-fo,saxon,Xslt,Xsl Fo,Saxon,我刚开始学习XSLT,现在我正在学习一些关于XSLT的在线教程,现在我有一个简单的问题: 假设我们有一个原始的xml文件,我们是否需要编写一个XSLT样式表来配合它,或者我们只是简单地将xml文件传递到一些软件中,比如Stylus Studio(Saxon引擎),然后它会自动为我们做所有这些事情 很抱歉澄清错误。我需要将此.svg文件转换为pdf,我刚刚开始开发,所以对第一步感到非常困惑。另外,我想知道,如果我的初始输入是.svg文件,在开始使用XSLT之前,我是否必须显式将其转换为.xml 提
提前谢谢 Svg是一个Xml文件。因此,您可以开始编写自己的XSLT样式表,将其转换为所需的格式
但是,快速搜索显示了许多可以为您执行此转换的程序。如果您想将数据转换为PDF,可以使用XSL:FO/FOP。您需要一个FOP模板,它是一个xsl文件,可以转换为PDF。此xsl文件可以引用XML、图像文件等外部对象,也可以使用freemarker/velocity将数据放入xsl模板 您可以找到更多信息: 如果使用FOP标记,可以引用SVG文件,如:
<fo:table text-align="left" table-layout="fixed"
background-image="SVG_file.svg">
我认为可以将svg文件作为参数添加到saxon中
很抱歉澄清错误。我需要将此.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)。从XSL-FO创建PDF需要一个处理器,如FOP、RenderX、天线室等
基本上你需要的是:
fo:externalgraphic
引用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处理器,我使用了ApacheFopVersion0.95(尽管我更喜欢RenderX)
- 萨克森HE和阿帕奇FOP都是免费的
- 如果您给我发电子邮件,我可以将我使用的SVG文件和完整的XSL-FO输出一起发送给您。我还可以将创建的PDF发送给您
<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样式表创建)
希望这能有所帮助。这取决于你想做什么。您对XSLT样式表有什么期望,应该进行什么转换?这个问题有点不清楚。你期望的结果是什么?您使用XSLT的目的是什么?不,如果您只想将svg转换为pdf,请尝试使用搜索引擎(如Google)搜索可以进行此转换的程序。假设现在我将使用java中的Saxon进行此转换,我是否应该将svg文件理解为输入xml,并将所述FOP模板理解为Saxon命令中的xml?非常感谢,DevNull,您是否可以通过电子邮件将您的svg发送给我?谢谢。我的电子邮件是thuderfan@live.com.Also,我有一个问题,您提供的XSL样式表和XSL-FO是否适用于所有svg文件,还是仅适用于特定的svg文件?thanks@Robert-XSL样式表应适用于所有svg文件。不过,我会删除
fo:externalgraphic
。如果确实希望使用fo:external graphic
而不是fo:instream foreign object
,则必须将svg文件名作为参数传递。我将通过电子邮件向您发送svg和完整的XSL-FO文件。
<?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>