(RUN!PC 116期第237頁起) #副標=Struts&JSTL&XSLT整合應用(5) #大標=霹靂變臉篇 #作者=歐宣修 規劃的XML結構如下: ================================= <!--標題區--> ====================================== 資料輸入區可置入多筆列數及輸入元件,我們只規範分為label及content,讓輸入元件由程式設計者決定要放入什麼元件對使用者最合適,所以格式如下: ================================ .... ======================================= 上下筆連結區標籤沒有內容,但有下列屬性: ============================ ==================================== ============================ .... =============================== =============================== single.xsl .............(1) .............(2)

.............(3)
.............(4)
.............(5) 訊息列: .............(6) .............(7) .............(8) .............(9) .............(10) .............(11) .............(12) .............(13) .............(14) 首筆  .............(15) 上筆   /   下筆   末筆
=============================== 1. 我們必須在XSLT檔頭宣告它的naming space及version,基本上照抄即可。 2. 此標籤很類似副程式(procedure)宣告,記得我們的來源樹的根節點(Root Node)是,所以當來源樹執行到此點時,透過match屬性去比對是否符合條件,若符合則進入此標籤內容執行。 3. 進入data 這template後,此時目前使用節點會停在,在下有這個子節點,透過<xsl:value-of select="title"/>可以把<title>這個節點的內容輸出,<xsl:value-of select="title"/>是簡寫,更完整的寫法是<xsl:value-of select="./title"/>,這種用法是不是很像在Windows檔案路徑的用法,只是"/"與"\"的差異,在select屬性值的語法又有一個名稱叫XPath,裡面又有其他名詞,怕再講下去有些讀者會昏倒,故不再深入,若有興趣讀者可參考相關資料。 4. <xsl:apply-templates select="message"/> 在data template裡要呼叫另外一個template就要應用這個標籤,以本例來說,若碰到<data>裡有<message>,則會進入message template。 5. <xsl:template match="message"> <tr> <td>訊息列:</td> <td> <xsl:value-of select="."/> </td> </tr> </xsl:template> 承繼上一項目,當進入message template時,來源樹目前節點將會停在<message>,會將此template裡的HTML標籤原封不動直接輸出,<xsl:value-of select="."/>會將目前節點,即<message>標籤內容輸出。 6. <xsl:template match="data_input"> <xsl:apply-templates select="row"/> </xsl:template> 在資料輸入區<data_input>的標籤規劃,裡面有<row>,在<row>還有子標籤<col>,在data_input template並沒有什麼需要特別去處理,但為配合XSLT的階層觀念,進入此template,再轉導至row template,透過這種技巧惟一目的就是要移動目前節點。 7. "label | content" XPath OR的語法,意指<label>或<content>皆符合此template。有OR就會有AND,XPath用[]表示,如"content[@width][@kind = '1']"即是<content>須有width屬性及kind屬性且kind屬性值為'1' 8. <xsl:if test="@width"> XSLT IF語法,判斷目前節點若有width屬性則進入此區段執行,在XPath裡使用@,代表後面字串為屬性名稱。 9. <xsl:attribute name="width"> <xsl:value-of select="@width"/> </xsl:attribute> 使用此標籤可用來增加屬性至結果樹,以本例來說即將width屬性增加至<td>,內容為來源樹目前節點之width屬性。 10. <xsl:for-each select="."> 將目前節點之所有子節點依序倒出。 11. <xsl:choose> <xsl:when test="input | select | textarea | a | p | br"> <xsl:apply-templates select="@* | node()"/> </xsl:when> </xsl:choose> 這語法不用多說,讀者應該一看就知道在幹嘛,多選一的判斷語法,<xsl:choose>必須包含<xsl:when>。 12. "@* | node()" 表示所有屬性或節點皆應用下一template。 13. "text()" XSLT亦有許多function,可資運用,此function可用來判斷目前節點是否為文字節點,所謂文字節點意指標籤包含內容,如<tag>文字節點</tag>。 14. <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:copy>與<xsl:value-of>不同,<xsL:value-of>用來輸出標籤所含內容,即文字節點;<xsl:copy>用來直接輸出原始標籤、屬性及內容,讀者可發現這裡用上遞迴,意義是將目前節點及其子節點、孫節點...,不論標籤、屬性、內容原封不動直接輸出。 15. <xsl:text> </xsl:text> 輸出空白,若我們直接在XSLT輸出空白是無用的,跟HTML一樣,所以要改用ASCII編碼,也可以用保留字,但在XSLT很奇怪, 不能用,只好改用ASCII,若是&、>、<則沒問題,筆者猜是Xalan的問題(註3)。 #小標=JSTL XML標籤 完成了來源樹及樣版樹的規劃,接下來就是要把兩者連接起來,筆者採用JSTL XML標籤,它擁有對XML DOM的處理及XSLT Paser能力。我們在JSP裡先用<c:set>及XSLT <xsl:import>將樣版樹取得,存入page scope,用法如下: ==============<box>================= <c:set var="xsl"> <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="/single.xsl" /> </xsl:stylesheet> </c:set> ==============<end>================= 再運用<x:transform>與來源樹合成,輸出HTML格式結果樹,透過xslt屬性連接代表樣版樹的變數,標籤內容即是來源樹內容,用法如下: ==============<box>================= <x:transform xslt="${xsl}"> <data> <title>員工基本資料維護(Struts+Process+JSTL+XSLT版) .... =============================== #小標=第一次變臉 所需傢伙都有了,可以開始變臉啦!筆者將本系列上一筆文章的employee.jsp改寫如下: =============================== <%@ page contentType="text/html;charset=UTF-8" import="java.io.*,java.util.*,idv.senshaw.DB.*,org.apache.struts.action.ActionErrors"%> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <%--決定按鈕狀態--%> <%--上筆、下筆連結處理--%> <%--設置XSLT樣版--%>
" /> " /> 員工基本資料維護(Struts+Process+JSTL+XSLT版) <%--訊息顯示區塊--%> <%--資料輸入區塊--%> <%--新增時--%> " maxlength="10" /> <%--修改時--%> " /> " maxlength="10" /> " maxlength="3" /> " /> <%--上下筆連結區塊--%> " now_record="" max_record="" next_href="" last_href="employee.jsp?toRecord=" /> <%--按鈕區塊--%> " value="存檔" />
<%--錯誤處理--%> ===============================