以前对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