XSLT是對XML的,但功能更多,雖然CSS也可以對XML做排版,但每個瀏覽器不一定顯示的都一樣,所以用XSLT就不會有這個問題
目前版本有分成 1.0 和 2.0
※xxx.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="ooo.xsl"?> <root> <item1> <xxx>x1</xxx> <ooo>o3</ooo> </item1> <item1> <xxx>x2</xxx> <ooo>o2</ooo> </item1> <item1> <xxx>x3</xxx> <ooo>o1</ooo> </item1> <item2> <xxx>x4</xxx> <ooo>o6</ooo> </item2> <item2> <xxx>x5</xxx> <ooo>o5</ooo> </item2> <item2> <xxx>x6</xxx> <ooo>o4</ooo> </item2> </root>
※引用了ooo.xsl
※ooo.xsl
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <body> <h2>OXO</h2> <table border="1"> <tr bgcolor="red"> <th align="left" width="100">O</th> <th align="right" width="100">X</th> </tr> <xsl:for-each select="root/item1"> <xsl:sort select="xxx" /> <tr> <td bgcolor="lightgreen"> <xsl:value-of select="ooo"/> </td> <td bgcolor="lightgreen"> <xsl:value-of select="xxx"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
※xsl:stylesheet和xsl:transform是完全一樣的,但大部分的人是用stylesheet,裡面的網址定了可用的標籤,也有語法教學
※template match="/"表示引用此份xsl時,是從根開始有作用,也就是整份文件都有作用
※for-each select 的路徑是從template match之後的路徑,假設將template match="/root",那如果想設成一樣的效果,那就將 for-each select="item1"即可,用的語法是XPath
將想要循環顯示的標籤包起來
※value-of select 是選節點用的,select仍然是XPath
※sort select 當然就是針對排序用的,看要針對哪個標籤,就寫上去
屬性 order 可用正序(ascending)和倒序(descending),正序是預設值
※直接將XML用IE瀏覽器打開是OK的,但用Chrome瀏覽器打開會出「Unsafe attempt to load URL file:///C:/~~~/ooo.xsl from frame with URL file:///C:/~~~/xxx.xml. 'file:' URLs are treated as unique security origins.」
什麼原因目前我不清楚,但看起來Chrome用file:///開頭,且又引用 xsl 都會出這個錯,所以我用Eclipse架Servlet,然後將此兩支丟進去就可以了,因為網址是http開頭的
※if
<xsl:for-each select="root/item1"> <xsl:sort select="xxx" /> <xsl:if test="ooo = 'o3' or ooo = 'o2'"> <tr> <td bgcolor="lightgreen"> <xsl:value-of select="ooo" /> </td> <td bgcolor="lightgreen"> <xsl:value-of select="xxx" /> </td> </tr> </xsl:if> </xsl:for-each>
※注意等於只有一個
※大小於要用>、<
※choose、when、otherwise
<xsl:for-each select="root/item1"> <xsl:sort select="xxx" /> <xsl:choose> <xsl:when test="ooo = 'o3'"> <tr> <td bgcolor="lightgreen"> <xsl:value-of select="ooo" /> </td> <td bgcolor="lightgreen"> <xsl:value-of select="xxx" /> </td> </tr> </xsl:when> <xsl:when test=" ooo = 'o2'"> <tr> <td bgcolor="pink"> <xsl:value-of select="ooo" /> </td> <td bgcolor="pink"> <xsl:value-of select="xxx" /> </td> </tr> </xsl:when> <xsl:otherwise> <tr> <td bgcolor="yellow"> <xsl:value-of select="ooo" /> </td> <td bgcolor="yellow"> <xsl:value-of select="xxx" /> </td> </tr> </xsl:otherwise> </xsl:choose> </xsl:for-each>
※JSTL也有這個,用choose包起來,裡面放很多個when和一個otherwise,其實就是if、else
※注意以此例 tr 看起來三個都有,所以提出去when的外面,這樣就只要寫一次,但這樣做是不會成功的
應該是 choose 和 when 之間不能加標籤吧!
※apply-templates
是template的子標籤,可以針對xml裡不同的標籤,套用到不同的模版,template 的 match不能重覆,會報錯<xsl:template match="/root"> <html> <body> <h2>OXO</h2> <xsl:apply-templates select="item1" /> <xsl:apply-templates select="item2" /> </body> </html> </xsl:template> <xsl:template match="item1"> XXX: <span style="color:#ff0000"> <xsl:value-of select="." /> </span> <br /> </xsl:template> <xsl:template match="item2"> OOO: <span style="color:#00ff00"> <xsl:value-of select="." /> </span> <br /> </xsl:template>
※select=".",表示此標籤下的標籤
沒有留言:
張貼留言