The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
分离数据与其展示 是一个伟大的概念。以HTML和CSS为例。HTML应该只包含纯粹的数据,而CSS则应该对数据进行格式化,以便人类阅读。多年以前,这可能是HTML/CSS的初衷,但实际上并不是这样的。主要是因为CSS的功能不够强大。
我们仍然需要使用HTML标签来格式化我们的数据,而CSS只能在位置和装饰方面提供少许帮助。
另一方面,XML与XSLT完美地实现了分离数据和展示的思想。XML文档,如同HTML,应该只包含数据,不包含任何有关位置或格式化的信息。XSL样式表负责定位和装饰数据。XSL是一种更强大的语言。这就是为什么可以避免在XML中进行任何格式化的原因。
Chrome、Safari、Firefox和IE的最新版本都支持这种机制。当浏览器从服务器检索到一个XML文档,并且该文档与一个XSL样式表关联时,浏览器会即时将XML转换为HTML。
让我们回顾一下一个简单的Java Web应用程序的工作方式。它使用Takes Framework使这种机制成为可能。在下一篇文章中,我将解释ReXSL的工作原理。不过,现在让我们专注于以XML形式传递裸数据并使用XSL样式表进行格式化的理念。
打开https://www.stateful.co——这是一个解释在Stateful.co的原子计数器文章中的有状态Web原语的集合。
在Chrome或Safari中打开它。当你这样做时,你应该看到一个正常的网页,带有一个标志、一些文本、一些链接、页脚等等。现在检查它的源代码(我假设你知道如何做这个)。
这大致是你将看到的内容(我假设你理解XML,如果不理解,立即开始学习):
正如您所见,这是一个具有属性、元素和数据的合法XML文档。它完全不包含有关如何向最终用户展示其元素的任何信息。实际上,这个文档更适合机器解析,而不是人类阅读。
该文档包含了对其请求者很重要的数据。如何渲染数据或是否渲染数据完全取决于请求者。
它的第二行将文档与独立于浏览器加载的XSL样式表/xsl/index.xsl
相关联。
在Chrome中打开开发者工具,你会看到在页面加载完毕后,浏览器会加载XSL样式表,然后加载所有其它资源,包括几个CSS样式表、jQuery和一个SVG标志。
让我们来考虑一个 index.xsl
的例子(实际上它要复杂得多,可以查看layout.xsl
)。例如:
我认为将这个XSL样式表应用到我们的XML文档后,HTML页面的样子显而易见。
对我来说,这个XSL看起来整洁且易于理解。然而,我经常听到人们说XSLT是一种难以理解的编程语言。但是我并不觉得它难以理解。当然,我没有使用它的所有功能。但是,对于简单的页面渲染,我只需要了解几个简单的命令和XML转换的原理即可。
现在,为什么这种方法比广泛使用的Java模板引擎更好,包括JSP、JSF、Velocity、FreeMarker、Tiles等等呢?
嗯,我认为有几个原因。但最重要的是:
XSL可以在没有服务器的情况下进行测试。为了测试我们的网站在特定数据下的外观,我们只需要创建一个带有必要测试数据的新XML文档,将其与XSL关联,并在浏览器中打开。我们还可以修改XML并在浏览器中刷新页面。这使得HTML/CSS设计师的工作变得更加轻松,独立于程序员。
XSL是一种功能强大的函数式语言。与其他大多数模板引擎相比,它们大多数看起来像是临时方案,而XSL是一个完整且设计良好的环境。一旦你熟悉了其语法和编程概念,编写XSL本身就是一种乐趣。你不是将指令注入到HTML文档中(像JSP和其他引擎那样),而是编写数据转换成展示的程序——这是一种不同的思维方式,感觉更好。
XML 输出是可以完全进行测试的。在 MVC 架构中,一个生成包含为 XSL 样式表所需数据的 XML 文档的控制器可以很容易地通过简单的 XPath 表达式在单个单元测试中进行测试。而将数据注入到模板引擎的控制器的测试则是一个更加复杂的操作,有时甚至是不可能的。我也写 PHP 和 Ruby。它们也存在完全相同的问题,尽管它们的模板引擎由于语言的解释性质而更加强大。
Is It Fully Supported?
如果所有浏览器都支持XML+XSL渲染,那就太好了。然而,事实远非如此。只有最新版本的现代浏览器支持XSL。请查看Julian Reschke所做的此比较。除此之外,XSLT 2.0根本不被支持。
然而,有一个变通方法。我们可以通过浏览器发出的请求(通过其User-Agent
HTTP头)来判断浏览器,并在服务器端将XML转换为HTML。因此,对于支持XSL的现代浏览器,我们将传递XML,对于其他所有浏览器,则传递HTML。
这正是ReXSL框架的工作原理。在Internet Explorer中打开https://www.stateful.co,您将看到一个HTML文档,而不是像Chrome那样的XML文档。
顺便说一句,看看这个是如何实现的:在Takes Framework中的XML数据和XSL视图。
阅读这篇文章,它继续讨论这个主题:RESTful API和网站在同一个URL中。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 16:04