gpt4 book ai didi

xslt - 一个关于 XSLT 的初学者问题

转载 作者:行者123 更新时间:2023-12-03 19:59:59 28 4
gpt4 key购买 nike

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

假设我们有一个原始的 xml 文件,我们是否需要编写一个 XSLT 样式表来配合它,或者我们只是简单地将 xml 文件传递​​到 Stylus Studio(Saxon Engine)之类的软件中,然后它会自动为我们?

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

提前致谢!

最佳答案

Sorry for the mis clarification.I need to convert this .svg file to a pdf,I am just now at the beginning of the development,so really confused about the first step.Also,I would like to know,if my initial input is a .svg file,do I have to explicitly transform it into an .xml before I can start using 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。

基本上你需要的是:
  • XML 输入(这将是您的 SVG 文件)
  • XSLT 转换以创建 XSL-FO。
  • 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>

    希望这可以帮助。

    关于xslt - 一个关于 XSLT 的初学者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121501/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com