初试xslt

简介: 以前对xslt的了解,主要是通过docbook,知道在将docbook的xml转换成html之前,可以自定义一份xsl文件,对xslt过程中的参数进行设置。这次,因为要把一个单元测试结果xml转换为html,第一次自己写了xsl文件。 首先纠结的是版本。发现w3cschool上的xslt教程是基于

以前对xslt的了解,主要是通过docbook,知道在将docbook的xml转换成html之前,可以自定义一份xsl文件,对xslt过程中的参数进行设置。这次,因为要把一个单元测试结果xml转换为html,第一次自己写了xsl文件。

首先纠结的是版本。发现w3cschool上的xslt教程是基于xslt1.0的,最初考虑可能需要生成多个html,xslt1.0没有这个功能,当时的设计就是一个输入对应一个输出。多文件输出是被定义在xslt1.1以后,或者还有个exsl的。最终还是选择了2.0版本的,但真正使用的,还都是1.0版本定义的标签,貌似libxsl也不支持2.0的。
其他的语法,和xml没有区别,只是定义了一系列的标签而已。xsl相关的标签,都是定义在xsl名字空间下的。所以需要在最外层标签上声明名字空间:xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”。xsl文件最外层标签为<xsl:stylesheet version=”2.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>定义了整个stylesheet,针对要生成的html,可以增加<xsl:output method=”html” encoding=”utf-8″ />这个标签,这样在生成的html中,会加上meta信息,定义content type和charset。
最常用的几个标签,基本就是xsl:template、xsl:apply-templates、xsl:value-of这些了。其中xsl:template定义了匹配到某个元素后进行的操作。比如最开始,当匹配到/节点的时候,我们需要输出html的最外层标签和头信息,就可以这样写:
<xsl:template match=”/”>
<html>
<head>
<title>结果报告</title>
</head>
为了xsl文件的可读性,一般会把标签分离出来单独用xsl:template定义转换的内容,所以需要使用xsl:apply-templates标签,这个标签定义了在此处,需要调用其他的转换模版。如:
<xsl:template match=”/”>
<html>
<head>
<title>结果报告</title>
</head>
<body>
<ol>
<xsl:apply-templates />
</ol>
</body>
</html>
</xsl:template>
这样,处理匹配到/节点的模版,只是定义了html头,其他内容会由其他的模版进行定义。
xsl:value-of标签,是从处理的xml中取值。它的使用方法非常简单,就是通过定义xpath,将xpath找到的元素或者属性的值取出来。如:
<li>
<xsl:value-of select=”@name” />
<ol>
<xsl:apply-templates select=”TestMethod” />
</ol>
</li>
这里会取出当前节点的name属性的值。
如果要给html的元素添加属性,这个属性的值是动态的(由xml中的元素控制),就不能直接在结果里面用xsl:value-of取值,需要用过xsl:attribute标签来定义一个属性。如:
<span >
<xsl:attribute name=”class”>
<xsl:choose>
<xsl:when test=”@status = ‘PASS'”>pass</xsl:when>
<xsl:when test=”@status = ‘SKIP'”>skip</xsl:when>
<xsl:when test=”@status = ‘FAIL'”>fail</xsl:when>
<xsl:otherwise>fail</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
这里通过当前节点的status属性值作为判断,如果值为PASS,则给转换结果的span标签增加一个class=”pass”的属性,这样转换之后的结果,为:
<span class=”pass”>
目前就基本使用了这几个标签完成了对xml的转换,要让浏览器能够直接进行转换,只要在原xml中增加:
<?xml-stylesheet type=”text/xsl” href=”xxx.xsl”?>
就可以了。这样浏览器在打开xml的时候,就会进行xslt,展示出html页面了。
要在java代码中增加:
handler.processingInstruction(“xml-stylesheet”,”type=\”text/xsl\” href=\”users.xsl\””);
这行代码就可以了。

转载自:https://coolex.info/blog/144.html
目录
相关文章
|
6月前
|
XML 测试技术 数据格式
如何使用 ABAP 代码解析 XML 文件试读版
如何使用 ABAP 代码解析 XML 文件试读版
57 0
如何使用 ABAP 代码解析 XML 文件试读版
|
2月前
|
XML 数据格式
什么是计算机软件里各种数据格式转换的 XSLT 程序
什么是计算机软件里各种数据格式转换的 XSLT 程序
15 0
|
9月前
|
XML JSON 网络协议
《XML解析随记》
最近在做这么一个功能, 就是现在各大视频网站都有的,手机视频软件里的视频投放到在同一WiFi下智能电视上进行播放。
|
JavaScript 前端开发
让我们使用JavaScript💻🤘制作一个可以正常工作的Guitar🎸
让我们来制作吉他!不是物理吉他,而是下面这个东西:数字吉他。感兴趣吗?就像一场精彩的摇滚表演一样,不妨来试试! 演示地址:https://haiyong.site/demo/js-guitar/ 代码已打包上传,在文章末尾哦
86 0
让我们使用JavaScript💻🤘制作一个可以正常工作的Guitar🎸
|
前端开发 JavaScript 开发工具
前端CSS常用代码集合
前端CSS常用代码集合
|
XML 存储 Java
【XML入门】一篇文章让你从没听过到熟练运用
今天我们继续来学习【Java Web】部分的XML,XML相比其他部分来时还是非常简单的。我们在以后写大项目时候也会经常用到,所以说还是蛮重要的。
【XML入门】一篇文章让你从没听过到熟练运用
|
Web App开发 JavaScript
riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法
基本要求 一个riot标签,就是展现和逻辑的组合(也就是html和JS) 以下是编写riot标签最基本的规则: 先撰写HTML,再撰写JS,JS代码可以写在标签内部,但这并不是必须的; 当riot标签定义在document body之内时,其内部不能使用script标签; 当riot...
1200 0
|
XML 程序员 API
[转载]C/C++ 开发人员:充实您的 XML 工具箱(初涉XML的值得一读)
本文针对哪些不熟悉 XML 开发的 C 和 C++ 程序员,概述了为 XML 开发作准备而装配的工具。工具表概述了常规 XML 工具,如 IDE 和模式设计器、解析器、XSLT 工具、SOAP 和 XML-RPC 库,以及其它可以在 C 和/或 C++ 中使用或者实际上以 C 和/或 C++ 编写的库。
1128 0