2017年2月5日 星期日

XSLT 1.0

CSS對HTML可以對HTML顯示排版、顏色…等
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>

※注意等於只有一個

※大小於要用&gt;、&lt;



※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=".",表示此標籤下的標籤

沒有留言:

張貼留言