天天看點

初試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标簽,這個标簽定義了在此處,需要調用其他的轉換模版。如:

<body>

<ol>

<xsl:apply-templates />

</ol>

</body>

</html>

</xsl:template>

這樣,處理比對到/節點的模版,隻是定義了html頭,其他内容會由其他的模版進行定義。

xsl:value-of标簽,是從處理的xml中取值。它的使用方法非常簡單,就是通過定義xpath,将xpath找到的元素或者屬性的值取出來。如:

<li>

<xsl:value-of select=”@name” />

<xsl:apply-templates select=”testmethod” />

</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