版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章可擴展樣式表語言轉換(XSLT)可擴展樣式表語言轉換(XSLT)是XML最重要的應用技術之一。他的主要作用是抽取XML文檔中的信息并將其轉換成其他格式的數據。引入XSL轉換的目的,是為了提供將XML文檔方便地轉換成所需數據形式的途徑。5.1什么是XSLXSL(eXtensibleStyleLanguge)是描述XML文檔樣式信息的一種語言,由W3C于1999年制定。雖然使用DOM、SAX、XMLPULL等編程模型也可以處理XML文檔,將其中的信息抽取出來并轉換成其他格式的數據,但如果對每個任務都編制專門程序,將無疑是低效而枯燥的。XSL則提供了將XML文檔方便地轉換成所需數據形式的新方法。5.1.1XSL構成XSL技術由3部分組成:XSL格式化對象(XSLFormattingObjects,XSL-FO,簡稱FO)、XSL轉換(XSLTransformations,XSLT)和XML路徑(XPath)。其各自的功能如下:1.格式化對象(FO)2.XSL轉換(XSLT)3.XPath技術5.1.2樹形結構樹形結構是一種數據結構,是總線形的延伸,它是一個分層分支的結構。樹狀結構是由連接起來的節(jié)點(node)組成的,這些節(jié)點起始于一個稱為根節(jié)點(root)的單節(jié)點。5.1.3XSL樣式單文檔XSL樣式單文檔是指使用XSL規(guī)則編寫的文檔,其作用是將一組元素描述的XML數據轉換為另一組元素描述的文檔,或者是將該數據轉換為一種自定義的文本格式。XSL把XML文檔轉換為完全不同的輸出,這樣可以把數據內容存儲在XML文檔中,然后通過各種媒體將其輸出到各種介質中,如無線電、打印、語音等格式。當數據發(fā)生變化時,只需要修改源XML文檔,不需要在多處重復相同的修改工作。5.1.4在何處進行XML變換樣式與內容相分離是XML最重要的特點,因此,要想以各種不同的樣式顯示XML文檔的內容就必須對XML的內容進行變換。對XML進行變換其實質就是抽取XML文檔所包含的“內容”,再轉變?yōu)樾枰@示的“樣式”。處理過程如圖5.2所示。5.2創(chuàng)建一個XSL實例使用XSL顯示XML的基本思想是通過定義模板將XML源文件轉換為帶樣式信息的可瀏覽文件,模板可以是HTML格式、帶CSS的XML格式及FO格式。
5.2.1源代碼及顯示效果有了以上對XSL的認識,下面將創(chuàng)建一個簡單的XSL實例來進行說明。5.2.2各部分詳解(1)XML部分在XML中使用如下語句聲明XSL樣式單。<?xml-stylesheettype="text/xsl"href="2.xsl"?>該語句表示使用的XSL樣式單為“2.xsl”文件。(2)XSL部分首先注意到的是,XSL文件本身就是一份XML文檔,因此在XSL文件的開頭,一樣有與XML文檔相同的聲明。W3C為XSL定義了很多標記(元素),XSL文件就是這些標記和HTML標記的組合。5.3XSL模板模板是XSLT中非常重要的概念。模板以“template”元素聲明,包含一系列XSL指令(Instruction),控制XSL轉換流程并指定XSL轉換的輸出內容。XSLT模板有兩種類型:一種作為模板規(guī)則(Templaterule),匹配指定的XML節(jié)點;另一種作為具名模板(Namedtemplate),可被“call-template”元素顯式調用。模板規(guī)則必須有“match”屬性,該屬性為XPath表達式,指定該模板可以匹配哪些XML節(jié)點。具名模板必須有“name”屬性,以被“call-template”元素調用。5.3.1模板的簡單應用XSLT處理器在發(fā)現XSLT文檔中的一個顯式調用或者在源XML文檔中發(fā)現匹配節(jié)點之后就會執(zhí)行xsl:template。最常見的情況是當XSLT處理器掃描XML時遇到了匹配節(jié)點。匹配屬性則用XPath表達式標識出源文檔中的節(jié)點,交由模板處理。向匹配的元素輸出模板需要的內容。這些內容可能由文本和非XSLT的標記所組成,并直接寫入某個新建文檔乃至更多的XSLT元素。XSLT元素只處理被模板激活的同類節(jié)點。多個模板可以匹配一個節(jié)點。在這種情況下,采用模式和優(yōu)先級屬性的復雜規(guī)則確定了應由哪個模板來處理節(jié)點。5.3.2xsl:apply-templates元素xsl:apply-templates可以告訴格式化程序把與源元素匹配的每個子元素同樣式單中的模板相比較,用于匹配節(jié)點的模板本身可能包含xsl:apply-templates元素,以便搜索與其子節(jié)點的匹配。當格式化引擎處理節(jié)點時,此節(jié)點是作為整個樹形結構來看待的。圖5.6apply-templates元素輸出效果
5.3.3select特性“apply-templates”元素以select”屬性指定XPath表達式,遍歷該表達式所匹配節(jié)點集的每個節(jié)點,逐一應用相應的模板規(guī)則進行處理。此元素的屬性如表5.1所示,結構關系如表5.2所示。名稱用法默認值說明select可選node()XPath表達式,以當前XML上下文節(jié)點為基礎,選擇匹配的節(jié)點集mode可選“”指定所應用模板所應具有的模式屬性5.3.4默認的模板規(guī)則XSL定義兩個默認的模板規(guī)則,在所有的樣式單中都隱性地包括這兩個規(guī)則。第一個默認規(guī)則將模板應用于所有元素的子元素,以遞歸的形式,降序排列元素的結構樹。這種方式可確保應用于元素的所有模板規(guī)則都能夠被說明。第二個默認規(guī)則應用于下一個節(jié)點,將這些節(jié)點的值復制到輸出流中。這兩個規(guī)則共同使用,表示即使是沒有任何元素的空XSL樣式單,仍將產生把輸入的XML文檔的原始字符數據作為輸出內容的結果。5.4XSL元素XSLT是一種說明性的語言,通過其元素、屬性指示XSL處理器執(zhí)行XML文檔的轉換操作。XSLT元素必須屬于“/1999/XSL/Transform”名稱空間。元素的前綴取名是否為“xsl”是無關緊要的,但一般都使用“xsl”作為XSLT元素的前綴。5.4.1XSL元素構成XML元素指的是從該元素的開始標記到結束標記之間的這部分內容。XML元素有元素內容,混合內容,簡單內容或者空內容。每個元素都可以擁有自己的屬性。XML元素命名必須遵守下面的規(guī)則:(1)元素的名字可以包含子母,數字和其他字符。(2)元素的名字不能以數字或者標點符號開頭。(3)元素的名字不能以XML(或者xml,Xml,xMl...)開頭。(4)元素的名字不能包含空格。5.4.2循環(huán)xsl:for-each“for-each”元素內包含一系列指令,用于處理“select”屬性匹配的每個節(jié)點。具體過程如下。(1)以當前上下文節(jié)點為基礎,使用“select”屬性的XPath表達式,匹配XML文檔的節(jié)點。(2)如所得的匹配節(jié)點集不為空,則執(zhí)行“for-each”的指令。(3)執(zhí)行指令時,將選出節(jié)點集內的第1個節(jié)點設為上下文節(jié)點。(4)然后將XSL處理流程轉到“for-each”元素內的指令。(5)“for-each”內的所有指令都處理完畢后,將匹配節(jié)點集的下一個節(jié)點設為上下文節(jié)點,XSL處理流程轉到“for-each”開頭,再用“for-each”內的指令處理該節(jié)點。(6)重復上述過程,直到“select”屬性選出的所有節(jié)點處理完畢為止。(7)處理流程轉向“for-each”元素后的XSL節(jié)點。5.4.3排序xsl:sort“sort”元素用于排序“apply-templates”或“for-each”元素選出的節(jié)點集。此元素的屬性如表5.11所示,結構關系如表5.12所示。5.4.4選擇xsl:if和xsl:choose“if”元素指定一個條件,如條件成立,則執(zhí)行“if”包含的指令?!癱hoose”元素和“when”、“otherwise”元素配合使用,根據條件執(zhí)行XSLT指令。5.4.5xsl:fallback元素“fallback”用于指定在XSL處理器缺少所需特性時的處理辦法。使用此元素可提高XSL轉換的兼容性,使之可同時被多種XSL處理器處理。此元素的結構關系如表5.18所示?!癴allback”元素的內容作為缺失父元素特性時的輸出內容。如果處理器能夠處理父元素所代表的特性,則會忽略“fallback”的所有內容。5.4.6XSL函數集XSL轉換過程中,除了可以調用XPath的函數(如position、number等),還可以調用XSLT函數。1.當前節(jié)點函數current()2.文檔訪問函數document()3.元素有效性函數element-avaible()4.格式轉化函數format-number()5.函數有效性函數function-available()6.元素標識符函數generate-id()7.節(jié)點索引函數key()8.系統屬性函數system-property()9.非解析實體函數unparsed-entity-uri()10.繼承的XPath函數集InheritedXPathFunctions5.5匹配節(jié)點的模式xsl:template元素的match特性支持復雜的語法,允許人們精確地表達想要和不想要與哪個節(jié)點匹配。xsl:apply-templates、xsl:value-of、xsl:for-each、xsl:copy-of和xsl:sort的select特性支持功能更加強大的語法的超集,允許人們精確地表達想要和不想要選擇哪個節(jié)點。下面討論匹配和選擇節(jié)點的各種模式。5.5.1匹配根節(jié)點為了使輸出的文檔結構整潔。從XSL變換的第一個輸出內容應為輸出文檔的根元素。因此,XSL樣式單一般以應用于根節(jié)點的規(guī)則開始。要在規(guī)則中指定根節(jié)點,可將其match特性設置為合適的值。示例如下。<xsl:templatematch="/"><html><xsl:apply-templates/></html></xsl:template>本規(guī)則應用于根節(jié)點,并且只應用于輸入樹形結構的根節(jié)點。當讀取到此根節(jié)點時,就輸出<html>標記,處理根節(jié)點的子節(jié)點,然后輸出</html>標記。5.5.2匹配元素名在正如前面介紹的那樣,最基本的模式只包含一個元素名,用來匹配所有帶有該名的元素。例如,下面的模板與Student元素相匹配,并將Student元素的name子元素標成粗體。<xsl:templatematch=”Student”><b><xsl:value-ofselect=”name”/><b></xsl:template>5.5.3使用/字符匹配子節(jié)點在match特性中并不局限于當前節(jié)點的子節(jié)點,可使用/符號來匹配指定的元素后代。當單獨使用/符號時,它表示引用根節(jié)點。但是,在兩個名稱之間使用此符號時,表示第二個是第一個的子代。例如,student/name引用name元素,name元素為student元素的子元素。在xsl:template元素中,這種方法能夠用來只與某些給定類型的元素進行匹配。例如,下面的模板規(guī)則將student子元素的name元素標記為Strong。此規(guī)則與不是student元素的直系子元素的NAME元素無關。5.5.4使用//字符匹配子節(jié)點在有時候,尤其是使用不規(guī)則的層次時,更容易的方法就是越過中間節(jié)點、只選擇給定類型的所有元素,而不管這些元素是不是直系子、孫、重孫或其他所有的元素。雙斜杠(//)引用任意級別的后代元素。5.5.5通過ID匹配在某些時候需要把一特定的樣式應用于特定的單一元素中,而不改變該類型的所有其他元素。在XSL中實現此目的的最簡單的方法是,將樣式與元素的ID作為選擇符(其中包括以單引號括起來的ID值)就能夠做到這一點。5.5.6使用@來匹配特性@符號根據特性名與特性相匹配,并選擇節(jié)點。方法很簡單,只需在要選擇的特性前加上@符號。5.5.7使用comments()注釋要使注釋成為文檔的必不可少的部分,確實不是好主意。在大多數時候,可能應該完全忽略XML文檔中的注釋。但是,當不得不選擇注釋時,XSL確實提供了選擇注釋的手段。為了選擇注釋,可使用comment()模式。盡管此模式有類似函數的圓括號,但實際上卻不帶任何參數,要區(qū)分不同的注釋不太容易。實際應用時,決不要將重要信息放在注釋中。XSL允許人們選擇注釋的唯一真實的理由是:用樣式單把一種標記語言變換成另一種標記語言,同時又能使注釋保持不變。選擇注釋的任何其他方面的用途都意味著原文檔設計得不好。5.5.8使用pi()來匹配處理指令pi()函數選擇處理指令。pi()的參數是放在引號內的字符串,表示要選擇的處理指令的名稱。如果沒有參數,則匹配當前節(jié)點的第一個處理指令子節(jié)點。但是,可以使用層次操作符。5.5.9用text()來匹配文本節(jié)點text()操作符能夠明確選擇一個元素的文本子元素。盡管這種操作符有圓括號,但不需要任何參數。示例如下。<xsl:templatematch="SYMBOL"><xsl:value-ofselect="text()"/></xsl:template>此操作符存在的主要原因是為了用于默認規(guī)則。無論作者是否指定默認規(guī)則,XSL處理程序必須提供下列的默認規(guī)則。5.5.10使用“或”操作符豎線(|)允許一條模板規(guī)則匹配多種模式。如果節(jié)點與某種模式相匹配,則此節(jié)點將激活該模板。例如,下面模板規(guī)則與Student和Teacher元素都匹配。<xsl:templatematch=”StudentR|Teacher”><B><xsl:apply-templates/></B></xsl:template>也可以在|兩邊加入空格,這樣使代碼更清晰。示例如下。<xsl:templatematch=”StudentR|Teacher”><B><xsl:apply-templates/></B></xsl:template>5.6輸出格式與編碼問題在這一節(jié)中,主要介紹輸出文檔、輸出文本、輸出元素、輸出屬性、輸出指令、輸出注釋、輸出消息,替換名稱空間以及空白符的輸出幾個部分。5.6.1輸出文檔<xsl:output>元素用于控制輸出文檔的類型及格式。該元素必須作為XSLT文檔的頂層元素出現,即只能作為<xsl:stylesheet>元素的子元素出現。在前面的內容中提到,XSLT可以將XML文檔轉換為XML、HTML、TEXT等格式。XSLT究竟將XML源文檔轉換為哪種格式的文檔,正是由<xsl:output>元素決定。5.6.2輸出文本輸出控制指令——<xsl:output>用來控制輸出文檔的格式,在具體的輸出工作中,最常用的則是輸出文本。輸出文本所用到的指令為<xsl:value-of>。<xsl:value-of>的使用語法如下。<xsl:value-ofselect="xpathExpression"disable-output-escaping="yes|no"/>代碼說明如下。(1)select屬性,必選。指定一個XPath表達式,注意XPath表達式有4種數據類型。(2)disable-output-escaping屬性,可選。用于指定是否禁用輸出字符轉義。默認值為no。5.6.3輸出元素元素是一個XML文檔構成的基本單位。在XSLT轉換文檔中,可以使用指令<elementName>直接生成元素,這樣的元素將被直接輸出到目標XML文檔中。但有時這種方式會失效,例如,元素名需要動態(tài)生成、特殊名稱空間元素等。這就需要用到生成元素指令<xsl:element>。5.6.4輸出屬性<xsl:attribute>指令用于創(chuàng)建一個屬性。由于屬性總是依附于元素存在,所以,該指令總是存在于某個元素的內容模板之內。該指令生成的屬性將被添加到該元素中。<xsl:attribute>元素用于創(chuàng)建屬性,并將屬性添加到元素節(jié)點中。5.6.5輸出指令在XML文檔中,指令也是不可或缺的一部分,本節(jié)將講述如何向目標XML文檔輸出指令。向目標XML文檔輸出處理指令,應該使用<xsl:processing-instruction>元素。5.6.6輸出注釋輸出注釋節(jié)點需要用到指令<xsl:comment>。<xsl:comment>指令的使用語法如下所示。<xsl:comment><!—--注釋內容--!></xsl:comment>代碼說明。commentcontent注釋內容用來為新生成的注釋節(jié)點提供內容。5.6.7輸出消息消息輸出也是很多編程語言中都具備的功能。XSLT的消息一般都是輸出在控制臺中,并可以控制是否需要停止程序的執(zhí)行。輸出消息所使用的XSLT元素為<xsl:message>。其使用語法如下所示。<xsl:messageterminate="yes|no"><!—內容:模板--></xsl:message>代碼說明。屬性terminate,可選。用于指定是否終止程序的執(zhí)行。當其值為“yes”時,處理器將給出消息窗口,并終止程序的執(zhí)行;當其值為“no”時,程序將繼續(xù)執(zhí)行。默認值為no。5.6.8替換名稱空間在XSLT中還有另外一個針對名稱空間的處理指令,這就是<xsl:namespace-alias>元素。<xsl:namespace-alias>元素使得輸出時,以不同的名稱空間來代替XSLT文檔中的名稱空間。其使用語法如下所示。<xsl:namespace-aliasstylesheet-prefix="prefix|#default"result-prefix="prefix|"#default"/>代碼說明。(1)屬性stylesheet-prefix,必選。指定在XSLT中想要改變的名稱空間的前綴。(2)屬性result-prefix,可選。指定在輸出中要轉換為哪個名稱空間的前綴。5.6.9空白符的輸出空白符是指空格、制表符、回車符和換行符4種字符??瞻追麑崒嵲谠诘卮嬖谟赬ML文檔中,但卻容易被忽略??瞻追赬ML文檔中,是以文本節(jié)點的形式存在的??瞻追梢苑譃閮深?,如下所示。(1)無意義空白符。這類空白符往往是為了XML文檔的可讀性更強,而添加的換行和縮進。這類空白符并非有用信息。因此在進行處理時,應當忽略其存在。(2)有意義空白符。這類空白符是文檔內容的有機組成部分,屬于存儲的信息。應當予以保留。5.7格式對象FOXSL-FO現在也通常叫做XSL。通過前面的介紹可以知道:XSL是一種以XML為基礎的標記語言,它對輸出到屏幕、紙張或其他媒體上的XML數據的格式化作了具體的描述。如果XML只是轉換為HTML這類格式,使用XSLT即可,如果要轉換到PDF等格式,需要使用XSL-FO。XSL-FO是W3C指定的、用于格式化XML數據的語言。XSL-FO全稱為ExtensibleStylesheetLanguageFormattingObjects(格式化對象的可擴展樣式表語言),XSL-FO定義了一大堆格式對象,例如頁面、表格等等,但沒有限定使用什么方式顯示,可以轉換成PDF,SVG,甚至GUI控件。5.7.1XSL-FO文檔當萬維網聯盟(W3C)做出第一份XSL工作草案時,它囊括了XML文檔的轉換和格式化的語法。后來,W3C的XSL工作組把原草案分成了以下幾塊參考標準。(1)XSLT,alanguagefortransformingXMLdocuments(2)XSL或XSL-FO,用于格式化XML文檔的一種語言(3)XPath,用于在XML文檔中對元素和屬性進行操作的語言XSL-FO文檔是含有輸出信息的XML文檔。XSL-FO文檔是含有輸出信息的XML文檔。它們包含了輸出排版和輸出內容的信息5.7.2XSL-FO區(qū)域XSL-FO用矩形塊(域)顯示結果。XSL格式化模型定義了大量的矩形域(塊狀區(qū))來顯示數據,所有的結果(文本,圖片,等等)都會被格式化后放入這些區(qū)域里,然后在目標媒體上顯示或打印出來。XSL-FO結果被格式化成頁面形式。打印出來的結果通常會形成很多分開的頁面。瀏覽器的輸出結果通常會是長長的一頁。XSL-FO每頁都含有大量的區(qū)域。5.7.3XSL-FO輸出XSL-FO在<fo:flow>元素里定義輸出結果。它包含了頁面(Page)、流向(Flow)、區(qū)域(Block)三個部分。其內容可以概括為:“Flows元素的內容Blocks進入Pages,然后到達輸出的媒體?!盭SL-FO輸出通常嵌在<fo:block>元素、<fo:flow>元素、以及<fo:sequence>元素里。5.7.4XSL-FOFLOWXSL-FO充滿了來自<fo:flow>元素的數據。XSL-FO用<fo:sequence>元素來定義輸出頁面每個輸出的頁面都涉及到定義頁面排版的頁面模版,每頁輸出頁面指都有定義輸出的<fo:flow>元素,每頁輸出頁面都按順序打印(或顯示)。<fo:flow>元素包含了要被打印在頁面上的所有元素。當頁面印滿時,相同的頁面模版(pagemaster)會被反復地使用直到所有文本都被打印出來為止。<fo:flow>元素有“flow-name”(流向名)屬性。流向名(flow-name)屬性的值決定了<fo:flow>元素內容的流向。5.7.5XSL-FO頁面XSL-FO使用名為“PageMasters”的頁面模板來定義頁面的排版,每塊模板必須有個獨立的名稱。XSL-FO使用下面的屬性來定義頁面的大小。(1)margin-top定義了頂邊空白(2)margin-bottom定義了底邊空白(3)margin-left定義了左邊空白(4)margin-right定義了右邊空白(5)margin定義了所有的四邊空白XSL-FO用以下元素來定義頁面的區(qū)域。(1)region-body定義了整體區(qū)域(2)region-before定義了頂端的區(qū)域(標題)(3)region-after定義了底端區(qū)域(頁腳)(4)region-start定義了左端區(qū)域(左端工具條)(5)region-end定義了右端區(qū)域(右端工具條)5.7.6XSL-FO塊狀區(qū)域XSL-FO輸出進入塊狀區(qū)域。它包括XSL-FOPages,Flow
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人住房維修基金擔保責任協議4篇
- 2025年金融機構間協議存款風險管理合同3篇
- 二零二五版汽車分期付款及二手車交易及售后服務合同3篇
- 2025版學?;顒又行淖赓U合同范本2篇
- 2025版出租車司機職業(yè)操守擔保合同2篇
- 2025版?zhèn)€人車輛抵押債權債務處理執(zhí)行條款4篇
- 2025年長沙考貨運從業(yè)資格證駕校
- 2025年綠色建筑項目施工連帶責任保證合同4篇
- 2025餐飲拆伙協議書退伙后品牌使用權及保密協議3篇
- 卸車事故緊急處理與賠償協議2025年度3篇
- 中華人民共和國保守國家秘密法實施條例培訓課件
- 管道坡口技術培訓
- 2024年全國統一高考英語試卷(新課標Ⅰ卷)含答案
- 2024年認證行業(yè)法律法規(guī)及認證基礎知識 CCAA年度確認 試題與答案
- 皮膚儲存新技術及臨床應用
- 外研版七年級英語上冊《閱讀理解》專項練習題(含答案)
- 2024年遼寧石化職業(yè)技術學院單招職業(yè)適應性測試題庫必考題
- 上海市復旦大學附中2024屆高考沖刺模擬數學試題含解析
- 幼兒園公開課:大班健康《國王生病了》課件
- 小學六年級說明文閱讀題與答案大全
- 人教pep小學六年級上冊英語閱讀理解練習題大全含答案
評論
0/150
提交評論