XSLT 和 XSL-FO 有啥区别?

Posted

技术标签:

【中文标题】XSLT 和 XSL-FO 有啥区别?【英文标题】:What's the difference between XSLT and XSL-FO?XSLT 和 XSL-FO 有什么区别? 【发布时间】:2010-10-18 22:21:08 【问题描述】:

XSLT 和 XSL-FO 有什么区别?

我读过的每一个资源都将它们视为 1,或者至少非常紧密地联系在一起..

【问题讨论】:

另见***.com/q/10641667/287948 【参考方案1】:

我想知道这个问题的基础,因为我认为它很容易回答,但是一旦你来到这里:http://www.w3.org/TR/xsl/ 很明显它实际上是一个很好的问题 - 因为几乎第一件事就是页面是这样的声明:

本规范定义了可扩展样式表语言 (XSL) 的特性和语法,这是一种用于表达样式表的语言。它由两部分组成:

    一种用于转换 XML 的语言 文档 (XSLT),以及 用于指定的 XML 词汇表 格式化语义。

然而,回到现实世界,XSLT(这也是大多数人认为您所说的 XSL 的意思)是将 XML 文档转换成其他东西的一种方法——其他东西往往不是另一个结构良好的文档也格式化为 XML(尽管我使用 XSLT 将 XML 呈现为 csv 和纯(ish)文本)。

另一方面,XSL-FO 是关于格式化的——关于以相当严格的方式在一个页面或一系列页面上布置内容。它很有用,因为它允许您管理分布在多个页面上的内容,它相对简单地指定页面(或偶数页和奇数页)的格式,包括页眉、页脚、边框、列等,并使您的内容流入其中.因此,需要以 XML 格式加载数据,然后使用 XSLT 将该数据转换为由 XSL-FO 组成的文档,然后使用适当的工具(例如 PDF)进行渲染以进行打印或其他分发方式.

我的用例是获取一堆表格数据,将该数据导出为 XML,将其渲染为 XSL-FO,然后从那里转换为 PDF,然后再将其发送给打印机,打印机将所述 PDF 转换为 500 页的目录。在 XSL-FO 中指定需要页码、特定情况下的分页符、有一个目录和一个索引(每个都基于特定元素),并且呈现过程(到 PDF)处理填充页码全面的。

希望你现在不那么困惑了..

【讨论】:

【参考方案2】:

除了首字母缩略词的相似性之外,这两种技术曾经是同一个 W3C 规范的一部分(草稿形式)。后来决定将 XSL(XSL-fo) 和 XSLT 分成两个独立的规范。

Quote from W3Schools:

XSL-FO 正式命名为 XSL

为什么会出现这种混乱?是 XSL-FO 和 XSL 一样的吗?

是的,但我们会给你一个 解释:

造型既是关于变换,也是关于 格式化信息。当世界 万维网联盟 (W3C) 第一个 XSL 工作草案,它包含 两者的语言语法 转换和格式化 XML 文件。

后来,W3C 的工作组分裂了 将原稿分开 建议:

* XSLT, a language for transforming XML documents
* XSL or XSL-FO, a language for formatting XML documents
* XPath, a language for navigating in XML documents

可以在 Dave Pawson 的主页上找到年表的详细注释: http://www.dpawson.co.uk/xsl/sect1/history.html

【讨论】:

【参考方案3】:

XSL 是用于转换和呈现 XML 文档的语言系列

XSLT(XSL 转换):是一种用于将 XML 文档转换为 其他 XML 文档或其他格式(例如用于 Web 的 HTML)的语言页面、纯文本XSL格式化对象,随后可以转换为其他格式,例如PDF、PostScript和PNG。 p>

改造可以通过以下三种方式进行:

    引用: Let the browser do the transformation : 使用 <xsl:processing-instruction> 嵌入式: Client side transformation using javascript. 运行时: To make XML data available to all kind of browsers, we can transform the XML document on the SERVER.

例如

XSL-FO(XSL 格式化对象):Web 浏览器不支持,因为它是为打印输出而设计的,而不是在线查看。 (来自@Hobbes) 当前支持的输出格式包括 PDF、PCL、PS、AFP、TIFF、PNG、SVG、XML(区域树表示)、打印、AWT 和 TXT。主要输出目标是 PDF。 Soruce

示例代码:

<fo:table-row >
            <fo:table-cell>
                <fo:block></fo:block>
            </fo:table-cell>
        </fo:table-row>

流程图:

【讨论】:

Web 浏览器不支持 XSL-FO,因为它是为打印输出而不是在线查看而设计的。 @Hobbes 感谢您提供宝贵的信息,让我也补充一下这一点【参考方案4】:

XSLT 用于转换,XSL(与 XSL-FO 相同)用于格式化。

http://www.w3schools.com/xslfo/xslfo_intro.asp

【讨论】:

这个“最佳答案”只是部分正确,Mads Hansen 和下面的其他人是真正的最佳答案。 同意@Rob。 XSLT 是一种用于转换 XML 的转换语言。 XSL-FO 是一个用于分页布局和格式化的 XML 词汇表。 XSL 由 XSLT 和 XSL-FO 组成。【参考方案5】:

Wikipedia definition 呢?

XSL 格式化对象或 XSL-FO 是 XML 文档的标记语言 最常用的格式 生成 PDF。 XSL-FO 是 XSL 的一部分, 一组 W3C 技术,专为 的转换和格式化 XML 数据。 XSL 的其他部分是 XSLT 和 XPath。截至 12 月 12 日, 2006 年,XSL-FO 的当前版本是 v1.1.

【讨论】:

这不再正确,XSL XSL-FO。然而,XSLT 和 XPath 不是 XSL 或 XSL 的一部分。它们是来自 W3C 的独立建议。 他们最初是作为草案形式的同一规范的一部分,然后他们决定将它们拆分为单独的规范。这可能导致了混乱(除了首字母缩写词的相似之处)。【参考方案6】:

正如w3schools tutorial site(与 w3.org 无关)所说,这可能会让人很困惑

XSL-FO 现在正式命名为 XSL

这意味着 XSL-FO 和 XSL 是同一个东西,但它们不是!

XSL 基本上是将 XML 数据表示为 HTML 文档 XSL-FO 是关于文档本身的格式化。例如,如果您想将 XML 转换为 word 文档,您想添加页码、更改页边距或页面布局、添加页眉和页脚等。这些项目只能通过 XSL FO 标签来处理,XSLT 无法访问文档属性。在技​​术领域,您很可能会遇到 XML 数据以 word 或 PDF 文档呈现的场景。它需要页码、布局格式、页眉等。这些是文档中非常重要的部分。

另一个很大的区别是 XSL 和 XSL FO 有不同的引擎。 XSL 无法呈现 XSL-FO 标记。这个问题讨论了 XSL FO 使用哪个引擎

Which is the Best commercial xsl fo engine?

一个典型的 XSL Fo tempate 像这样

<?xml version="1.0" encoding="ISO-8859-1"?>

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>
  <fo:simple-page-master master-name="A4">
    <fo:region-body />
  </fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="A4">
  <fo:flow flow-name="xsl-region-body">
    <fo:block>Hello W3Schools</fo:block>
  </fo:flow>
</fo:page-sequence>

</fo:root> 

请注意,没有对 XML 数据的引用。这完全是关于格式化文档本身。在将 XML 数据转换为合法文档时,这是一个极其重要的元素。因为如果输出文档是 pdf 或 word,则需要寻呼机编号、文档编号、布局等。没有这些信息,很难实现页码或标题等。

之所以会出现混淆,是因为该文档几乎肯定会包含 XSL 标记,因为我们将提取 XML 数据。但是如果没有 XSL Fo 引擎,文档将不会被渲染。

所以简而言之,它们是相似的并且可以一起工作,但它们不是一回事。它们由不同的引擎渲染。

【讨论】:

所以如果我有使用 xsl:template 标签和 html 的 xslt 模板,我不能使用 xsl-fo 来设置页面属性,因为你不能混合使用这两者? 很久没用了,记不太清了。【参考方案7】:

与许多其他事情一样,这取决于您的观点和历史。

XSLT 是一种语言(用 XML 编写)“用于将 XML 文档转换为其他 XML 文档。”尽管当前的 XSLT 3.0 CR (http://www.w3.org/TR/xslt-30/) 将其更改为“一种语言设计主要用于将 XML 文档转换为其他 XML 文档。” (已添加重点。)

XSL-FO 是“用于指定格式化语义的 XML 词汇表”。它在“可扩展样式表语言 (XSL) 版本 1.1”建议 (http://www.w3.org/TR/xsl11/) 中定义。格式化程序(例如 Antenna House)采用 FO 词汇表中的 XML 文档并生成样式化和分页输出。

历史的来源是,最初只有一个规范 - 可扩展样式表语言 (XSL) - 定义了转换 - 将您的 XML 放入 FO XML 词汇表 - 和样式 - 获得 FO成样式和分页的形式。与 Mads Hansen 的回答相关的 Dave Pawson (http://www.dpawson.co.uk/xsl/sect1/history.html) 的历史页面包含完整的详细信息,但在 XSL 成为推荐的过程中,转换部分被认为通常很有用,并被分解为“XSL 转换 ( XSLT)”。将标记转换为标记并不是什么新鲜事,但是拥有一个具有多个(大部分)兼容实现的标准是一股新鲜空气。

XSLT 处理部分 XML 文档的方式也被普遍认为是有用的,它被分解为“XML 路径语言 (XPath)”,因此它可以被其他规范使用。 (XPath 被 XQuery 和 XLink 等使用。)

这里的观点是,XSL 1.1 Recommendation 仍然定义了转换和格式化的过程,但是转换部分恰好在单独的文档中定义。见http://www.w3.org/TR/xsl11/#d0e386

虽然官方 XSL 1.1 PoV 是 XSLT 和 XSL-FO 都是 XSL 的一部分,并且可能每个 FO 格式化程序都可以完成转换部分,但实际上,大多数人使用外部将他们的 XML 转换为 FO 词汇表中的 XML XSLT 处理器并将 FO XML 提供给它们的格式化程序。

历史与观点的相遇是 XSLT 1.0 (http://www.w3.org/TR/xslt) 将自己定义为 XSL 系统的一部分:

XSLT 旨在用作 XSL 的一部分,XSL 是一种用于 XML 的样式表语言。除了 XSLT,XSL 还包括一个用于指定格式的 XML 词汇表。 XSL 指定 XML 文档的样式,它使用 XSLT 描述文档如何转换为另一个使用格式化词汇表的 XML 文档。

但这种观点在 XSLT 2.0 (http://www.w3.org/TR/xslt20/) 中不存在,并且到 XSLT 3.0 时早已不复存在。

观点的最后一部分是,当许多人说“XSL”时,他们只是指 XSLT,除了那些当他们说“XSL”时,他们指的是 XSL-FO,而大多数人都忘记了他们的 FO 格式化程序可以同时做这两件事。

【讨论】:

【参考方案8】:

XSL-FO 代表可扩展样式表语言格式化对象,它是关于格式化的,现在被称为 XSL 以避免所有混淆。所以不用再担心 XSL-FO。

然而,XSLT 是关于转换 XML。所以非常清楚。 XSL 是关于格式化,而 XSLT 是关于转换。

【讨论】:

不完全。 XSL-FO is 仍然称为 XSL-FO,这是引用它的最清晰的方式。 XSL 恰当地指代 XSLT 和 XSL-FO,但如果人们用它来指代其中之一,他们通常指的是 XSLT。【参考方案9】:

XSLT 是一种模板格式,可用于生成各种文档,包括纯文本文档。

XSL-FO 表示使用 XSLT 生成 FO 文档。

【讨论】:

不完全。 XSL-FO 是一个 XML 词汇表,用于指定文档的布局和格式。 XSL-FO 文档可以通过 XSLT 生成,也可以不使用 XSLT。 另外,XSL-FO 的含义与 FO 相同。

以上是关于XSLT 和 XSL-FO 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

和 有啥区别?

使用 XSLT 创建带有嵌套粗体/斜体标签的 XSL-FO

XSLT 中 * 和 node() 的区别

XSLT

XSL-FO 中是不是有“类似”的 CSS?

css float 减少 freemarker 中的间距 - 在 xslt 中没有区别