0

0

使用 XSLT 作为 HTML 的样式表_html/css_WEB-ITnose

php中文网

php中文网

发布时间:2016-06-24 12:07:43

|

1312人浏览过

|

来源于php中文网

原创

简介

  当听到样式表这个词时,您可能会想到 css 样式表。xslt 样式表通常用于 xml 转换,比如在 web 服务之间映射数据。因为 xslt 非常适合此用途,所以创建了顶层元素 别名,虽然这很少使用。这种 xslt 转换的输入结构与输出结构有很大的不同。最重要的是,命名空间的不同。

  XSLT 样式表的输入结构与输出结构相似,但却更简单些。其中已经扩充了一些标记,但大部分标记只是原样复制到输出。输入和输出的命名空间是相同的 (HTML)。输入文档也可以包含样式表指令(比如创建脚注),这些指令属于另一个命名空间,不会传递到输出中。

常用缩略语

CSS:级联样式表 XHTML:可扩展超文本标记语言 XPath:XML 路径语言 XSLT:可扩展样式表语言转换

  在本文中,我们将学习如何使用 XSLT 样式表扩充 XHTML 文档。文中的示例展示了如何使用指令,如何引用其他源文档的部分,以及如何使用链接在主文档中导航。此外,我们还探索了页面的解释和编译之间的区别。

CSS 样式表的局限性

  XSLT 样式表不会阻止您使用其他技术,比如 JavaScript 或 CSS。CSS 适用于字体、加粗、颜色、间距等。它不适合将来自不同位置的信息组合在一起,比如脚注、模块或生成一个目录。这正是 XSLT 的用武之地,它补充而不是替代了 CSS。

立即学习前端免费学习笔记(深入)”;

XSLT 用途示例

  实际上,您可以将 XSLT 代码集中在一个文件中。为了简单起见,本文中的每个示例均位于一个独立的 XSLT 文件中,除了一些必要的代码。清单 1 给出了必需的代码。

  清单 1. 必需的代码(位于 samples/common.xml 中)

     xmlns = " http://www.w3.org/1999/xhtml"

     xmlns:h = " http://www.w3.org/1999/xhtml"

     xmlns:a = " http://sourceforge.net/projects/arbalo/"

     xmlns:s = " http://www.w3.org/1999/XSL/Transform"

     exclude-result-prefixes = "a h"

     version = "1.0"

    

        

            

            

                 http-equiv = "content-type"

                 content = "text/html;charset=UTF-8" />

            

                 href = "common.css"

                 rel = "stylesheet"

                 type = "text/css" />

         s:copy >

     s:template >

     

    

        

            

            

         s:copy >

     s:template >

s:stylesheet >

  XHTML 的命名空间定义了两次:默认定义和 h:。默认命名空间用于编写输出 XHTML 标记,其中应该避免使用命名空间前缀。h: 用在 XPath 表达式中。

  本文使用 XSLT 1.0 版本。目前,大部分浏览器都无法解释 XSLT 2.0。但是,如果 XSLT 运行在服务器上,那么它可能是一个实用的选择。XSLT 2.0 还提供了:

XPATH 2.0(if…then…else 和许多内置的函数) 内置和用户编写的 XPATH 函数 分组

  在 清单 1 中:

s:template match="head" 扩充了源文档的 head 一节,添加了一个 CSS 样式表的链接。即使 UTF-8 是在 XML 中的默认编码,一些浏览器也需要内容类型才能呈现它。 s:template match="*" 是默认的详细副本。原则上,所有内容都会复制到目标文档中。如果遗漏了此模板,只会将标记的文本内容复制到目标文档。不会复制处理指令节点。

  本文中的所有其他示例都是导入 common.xsl 的独立文件。

扩充

  通过扩充,添加了一个未在源文档中显式请求的特性。一个示例是 清单 1 中的 CSS 样式表的链接。尝试另一个示例,向每个内部链接添加一个小箭头 (^ v),指明目标在它之前还是之后。清单 2 给出了该样式表。

  清单 2. 样式表(在 samples/linkUpDown.xsl 中)

     xmlns = " http://www.w3.org/1999/xhtml"

     xmlns:h = " http://www.w3.org/1999/xhtml"

     xmlns:s = " http://www.w3.org/1999/XSL/Transform"

     version = "1.0"

    

    

        

            

            

            

                

                     ^ s:text >

                 s:when >

                

                     v s:text >

                 s:when >

             s:choose >

            

         s:copy >

     s:template >

s:stylesheet >

  首先,导入清单 2 中的通用样式表。模板与内部链接(以 '#' 开头)相匹配。如果链接指向的锚点位于链接之前,那么使用一个向上箭头扩充该链接(如果情况相反,则使用向下箭头)。

  s:copy-of 和 s:apply-templates 可确保不会沿途丢下任何内容。

  清单 3 给出了一个示例文档(其中包含内部链接),它经过了清单 2 中的样式表进行扩充。

  清单 3. 源文档(在 samples/linkUpDown.xml 中)

xml-stylesheet href = "linkUpDown.xsl" type = "text/xsl" ?>

 

    

    

        

         This link goes downward. a > p >

        

         Reduce the size of the window to verify the link really works. p >

        

        

         This link goes upward. a >

         p >

     body >

html >      

  目标文档看起来相同,除了清单 4 中的条目。

  清单 4. 目标文档(在 samples/linkUpDown.html 中)

… v downwards. a > …

    … ^ upwards. a > …

指令

  您可以在源文档中添加一些指令,告诉样式表执行何种操作。它们属于另一个命名空间(在本例中为前缀 a:),不会被复制到目标文档。

  在清单 5 中,源文档中任何地方的指令标记 a:ref 都会创建一个脚注。

  清单 5. 样式表(在 samples/footnote.xsl 中)

     xmlns = " http://www.w3.org/1999/xhtml"

     xmlns:a = " http://sourceforge.net/projects/arbalo/"

     xmlns:h = " http://www.w3.org/1999/xhtml"

     xmlns:s = " http://www.w3.org/1999/XSL/Transform"

     version = "1.0"

    

    

        

            

            

            

                

             s:if >

         s:copy >

     s:template >

    

    

        

             name = "number"

             select = "count(preceding::a:ref) + 1" />

         a >

        

            

         a >

     s:template >

    

    

        

        

            

            

                 a >

                

                    

                 a >

                

             p >

         s:for-each >

     s:template >

s:stylesheet >

  使用源文档中的 a:references 指令,名为 references 的模板会在模板与该指令匹配的地方分配脚注。如果缺少这样一个指令,第一个与 body 匹配的模板会在 body 的末尾分配脚注,方法是调用名为 references 的相同模板。在两种情况下,都会列出脚注的内容,并生成一个由向上箭头表示的向上链接。

  第二个模板(匹配 a:ref)使用向下箭头创建脚注的链接。脚注具有编号。这里忽略了它的内容。

紫东太初
紫东太初

中科院和武汉AI研究院推出的新一代大模型

下载

  class="footnote" 属性在 XSLT 转换之后由一个 CSS 样式表解析,该样式表链接在 XSLT 样式表 common.xsl 中。

  清单 6 中的源文档使用 a:ref 指令创建脚注。

  清单 6. 源文档(在 samples/footnote.xml 中)

xml-stylesheet href = "footnote.xsl" type = "text/xsl" ?>

     xmlns = " http://www.w3.org/1999/xhtml"

     xmlns:a = " http://sourceforge.net/projects/arbalo/"

    

    

        

             This example looks a little scientific

            

                 From Latin

                 scientia em >

             a:ref >

             and academic

             From Greek akademia a:ref >.

         p >

        

             Do you know why?

            

                 It uses

                 footnotes em >.

             a:ref >

         p >

         Reduce size of window to verify links are generated. p >

         

     

     body >

html >

  目标文档将脚注列表包含在底部,如清单 7 所示。

  清单 7. 目标文档(在 samples/footnote.html 中)

     xmlns = " http://www.w3.org/1999/xhtml"

    xmlns:h = " http://www.w3.org/1999/xhtml"

    xmlns:a = " http://sourceforge.net/projects/arbalo/" >

    head >

   

       This example looks a little scientific

          v 1 a >

          and academic.

          v 2lt;/a>

       p >

       Do you know why?

          v 3 a >

       p >

       Reduce size of window to verify links are generated. p >

       br/>

   

    ^1 a >

       From Latin

       scientia em >

    p >

   

       ^2 a >From Greek akademia p >

    ^3 a >

       It uses

       footnotes em >.

    p >

    body >

html >

突破源文档的边界

  也可引用其他源文档的其中一些部分。a:include 指令包含一个可能属于另一个源文档的元素并转换它,如清单 8 所示。

  清单 8. 样式表(在 samples/include.xsl 中)

     xmlns = " http://www.w3.org/1999/xhtml"

     xmlns:a = " http://sourceforge.net/projects/arbalo/"

     xmlns:s = " http://www.w3.org/1999/XSL/Transform"

     version = "1.0"

    

    

        

            

                

                     select = "document(@src)//*[@id=current()/@refid]" />

             s:when >

            

                

select = "document(//a:default[1]/@src)//*[@id=current()/@refid]" />

             s:when >

            

                

                     select = "//*[@id=current()/@refid]" />

             s:when >

         s:choose >

     s:template >

s:stylesheet >

  源文档中的一个 a:include 指令引用源元素的 id。包含该元素的文档可在一个 src 属性中命名。如果缺少该属性,将使用 a:default 指令的 src 属性。如果在任何地方都没有 src 属性,则使用同一个源文档。因此,refid 会引用 id 来避免无限的递归。

  导入的元素可能具有一种复杂的类型,并在包含 (apply-templates)之后进行转换。清单 9、清单 10 和清单 11 给出了示例。

  清单 9. 源文档(在 samples/include.xml 中)

xml-stylesheet href = "include.xsl" type = "text/xsl" ?>

     xmlns = " http://www.w3.org/1999/xhtml"

     xmlns:a = " http://sourceforge.net/projects/arbalo/" >

    

        

     head >

    

         The following text is included: p >

        

        

         double p >

        

        

     body >

html >

  清单 10. 源文档的部分(在 samples/includeY.xml 中)

I'm the included em > h2 h2 >

I'm the included em > h1 h1 >

  清单 11. 目标文档(在 samples/include.html 中)

         The following text is included: p >

         I'm the included em > paragraph. p >

         I'm the included em > h1 h1 >

         double p >

         I'm the included em > h2 h2 >

         double p >

     body >

html >

主文档和导航

  如果您有一个包含多个页面的演示,有一个主文档包含页面标题及其链接。您可以生成完整的导航,从每个页面到任何其他页面,以及到前一个和后一个页面。这些细节不属于本文的介绍范围,但 参考资料 中提供了使用主文档的 HTML 演示的链接。可将 .xml 替换为 .html 来获得编译后的版本。让浏览器向您显示 .xml 的整洁源代码。您会对它生成的源代码量感到惊奇。

解释与编译的对比

  解释意味着页面为 XML 格式(其文件扩展名为 .xml,其内容类型为文本/xml 或应用程序/xml),并且处理指令所引用的 XSLT 样式表可在浏览器中执行。

  编译意味着浏览器看到的是 HTML(其文件扩展名为 .html,内容类型为文本/html),它是在请求页面之前从您的开发环境中或服务器上的 XML 转换而来的。Xalan 和 Saxon 都是著名的 XSLT 处理器。

  解释是未来的发展方向。所有现代浏览器都支持 XSLT,并且它具有一些优点:

当测试时,您会立即获得结果。只需在您测试的每个浏览器中按下 F5,即可反映源页面、CSS 和 XSLT 样式表的更改。 要传递给客户端的信息量减少了。 客户端看到的是一个干净、整洁的网页,因为还未生成扩充内容。

  但也要注意一些缺点:

有一些旧浏览器可能不支持 XSLT。如果向一个受控的环境(内部网)发布页面,就不会出现问题。 一些现代浏览器禁止 XSLT 样式表引用另一个目录中的另一个样式表。 将 XSLT 域其他功能相结合(比如 SVG 或 iframe)可能在一些浏览器中导致问题。 因为大部分浏览器都不支持 XSLT 2.0 或即将推出的 3.0,所以您无法使用新功能。没有 XPath 2.0 if () then … else,也没有用户编写的 XPath 功能。

  无论进行编译还是解释,页面的其他转换 (CSS、JavaScript) 都会在 XSLT 转换之后执行。

结束语

  在本文中,您学习了如何使用 XSLT 样式表来扩充 XHTML 文档。您可以使用本文中的示例作为起点,构建您自己的 XSLT 样式表。

下载

  文章和XML示例

关于作者

  Jürgen M. Regel 是位于德国汉诺威的 TUI InfoTec GmbH 的 Architecture Management & Software Engineering 部门的一名高级软件工程师。他主要研究旅游行业中的企业应用程序集成 (EAI)。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
swift开发文档
swift开发文档

共33课时 | 23.7万人学习

JavaScript—极速入门
JavaScript—极速入门

共23课时 | 4万人学习

Web开发基础_HTML+CSS
Web开发基础_HTML+CSS

共17课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号