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