用XSLT和Xpath查詢XML文檔_第1頁
用XSLT和Xpath查詢XML文檔_第2頁
用XSLT和Xpath查詢XML文檔_第3頁
用XSLT和Xpath查詢XML文檔_第4頁
用XSLT和Xpath查詢XML文檔_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、PAGE PAGE 68用XSLT和Xpath查詢XML文檔 1序言 1.1 XML概述1.1.1 XML產生背景 當今,互聯網已滲透到社會生活的每一個角落,在此過程中HTML超文本標記語言功不可磨,HTML以其簡單精練的語句和易于掌握的通用性和易學性,使web技術從計算機世界走向全社會,走向千家萬戶。然而由于電子商務,電子圖書,遠程教育等的異軍突起,使傳統的web資源更加復雜化,多樣化,于是高容量,高信息量,高效率成為網絡信息技術發展追求的目標,與此同時,人們對web服務功能的需求也達到了更高的標準,如:用戶需要對web進行智能化的語義搜索,對數據按不同的需求進行多樣化顯示等個性化服務;公司

2、和企業要為客戶創建和分發大量有價值的文檔信息,以降低生產成本;以及對不同平臺,不同格式的數據源進行數據集成和轉換等等。因此,面對著web技術的飛速發展,HTML存在著如下的不足: HTML的標記集合是固定的。隨著web技術的發展,新的數據格式不斷出現并且需要在網上展現,這就需要有一種比較靈活的標記機制來滿足不斷發展的web內容要求,但標準的HTML語法格式過于簡單,且又不允許用戶自己創建新的標記,這將無法支持那些專門的頁面格式,如:數學公式,化學方程式,音樂樂譜等。DHTML的問題。由于標準的HTML已經無法滿足用戶的需求,人們在其基礎上增加了動態的成分,如腳本程序等,但是這些非標準的技術制作

3、的網頁在不同的瀏覽器之見互不兼容。HTML只是一種表現技術,它并不能揭示HTML標簽所標記的信息的任何含義。隨著web文件變得越來越大,越來越復雜,web內容提供商已開始感受到普通的HTML已經無法提供用于大規模商業出版所需的擴展性,結構化和數據檢查功能。1.1.2 XML簡介 1996年7月W3C開始設計XML,1998年2月發布了XML1.0的第一個版本。XML是SGML的一個簡化子集,保留了SGML80%的功能,而其復雜程度只有原來的20%。XML將SGML的靈活性和強大功能與HTML的易用性結合到web的應用中,以一種開放的自我描述的方式定義了數據結構,在描述數據內容的同時能突出對結構

4、的描述,從而體現數據之間的關系。 與普通的標記語言不同,XML是一種元標記語言,即它是一種用來定義標記語言的標記語言。事實上,用戶可以利用XML語法和有限的元標記,來定義自己需要的任意的特殊標記集,即定義一種在功能上類似HTML標記的標記集,從而形成自己所獨有的一套標記語言。相對于HTML,XML具有很多優點: XML是自描述的。XML允許根據各種不同的規則來制定標記,如:商業規則,根據數據描述甚至根據數據關系來制定標記。XML實現了用定義它們自己的標記集來說明文檔內容的功能,說明的精度由實現者自己掌握。 XML支持對文檔內容的驗證。XML文檔的內容和結構是由DTD或XMLSchema 來定義

5、,我們可以根據它們來檢驗文檔的有效性。XML允許開發各種不同專業領域的特定標記語言,如:CML, MathML等。XML是非專有并易于閱讀和編寫的。這使得它成為在不同應用間交換數據的理想格式。XML是基于W3C定制的開放標準,從而使得基于XML的應用具有廣泛性。XML支持高級搜索。因為根據XML的語法規則,可以知曉文檔內容的結構和含義,所以在XML文檔中的搜索較為容易。如果web頁是XML格式的,則搜索會更高效,而且不僅可以搜索數據,還可以在搜索中加入與數據相關的上下文信息,形成更為精確的搜索機制。正因為XML有相對于HTML的這些優點,有人把它稱為下一代的web語言,甚至把XML說成是21世

6、紀的世界語,這些都說明了XML的巨大潛力。1.1.3 XML文檔的結構 規范的XML文檔 在編寫XML文檔時,必須保證文檔結構的規范性,這樣瀏覽器才能對其作出正確的解釋,否則會報錯。W3C在XML1.0推薦標準中對XML文檔的規范性作了定義。 當一個文本對象滿足下列條件時,就是一個規范的XML文檔:整體上是一個標記文檔。必須滿足XML1.0規范中所有的規范約束,即必須遵循XML1.0推薦標準中規定的語法規則。文本中直接或間接引用的解析實體都是規范的。 XML數據結構 所有規范的XML文檔都由以下三部分組成:序言(可選),它包含關于數據其余部分的重要信息。主體,它由一個或多個元素以層次樹的形式組

7、成。尾聲(可選),緊隨元素樹以各種各樣的形式出現。序言用于標記XML數據的開始,它描述數據的字符編碼,并為XML解析器和應用程序提供一些其它的配置線索。序言包括:一個XML聲明,一個可選的文檔類型聲明,以及多個可選的注釋,處理指令和空白字符等。 主體是XML文檔中唯一必須存在的部分,是XML數據最主要的內容。它包括:元素,屬性,字符數據等,除此之外,注釋,處理指令和空白字符也可交叉存儲在元素和字符數據中。主體被組織成一棵層次樹,在這棵樹中存在唯一的根節點,其對應的元素為文檔元素,是樹中所有其它元素的父元素,文檔中所有其它元素都是它的后代。父子元素之間要正確的嵌套。 尾聲是可選的,它可能包括:注

8、釋,處理指令或空白字符。1.1.4 本文的出發點 對于XML文檔,業界有兩種不同的觀點:其一,以文檔為中心的觀點認為XML文檔是一種帶批注的文本文件,該文件包含標記指令,用于控制被包含文本的格式和顯示,強調XML的語法并將尖括號視為XML的中心主題。其二,以數據為中心的觀點認為XML只是類型化值的許多種表示方法中的一種,軟件代理程序可以利用其進行數據互換和互操作,而將XML語法視為次要的細節。本文從后一種觀點出發,論述運用Xpath和XSLT查詢XML文檔。Xpath維持原文檔的層次性和結構,適用于訪問XML文檔的獨立節點,XSLT適用于對查詢結果進行處理,構建新的元素,在有必要的時候重新組織

9、結果元素,綜合運用XSLT和Xpath將允許開發者隨意而方便的對源文檔進行操作和重組。 由于Xpath是XSLT的基礎和核心。所以在談到XSLT之前須先對Xpath進行介紹。Xpath,即XML的路徑語言,這一名稱源于Xpath使用基于路徑的語法遍歷文檔的信息集。另外,Xpath的數據模型與XML Infoset的parent/childen模型平行,每個Xpath節點的屬性都可以通過對應的XML Infoset信息項的屬性查看,因此,在談及Xpath之前有必要對XML Infoset作一介紹。1.2 XML Infoset1.2.1 XML Infoset簡介 XML Infoset(XML

10、 Information Set)是所有XML規范中最關鍵的規范,該Infoset將XML的核心抽象概念模型化為一組具有一個或多個命名屬性的結構信息項的集合。它的用途是為那些需要引用XML文檔中的信息的規范提供一組一致的定義。如果一個XML文檔是規范的,并滿足命名空間的限制條件,那么這個文檔就有一個信息集,不符合命名空間的XML文檔,即使就技術上而言是規范的也被認為不具有有意義的信息集,但有信息集的XML文檔不一定必須是有效的。信息集可以通過解析XML文檔的方式來創建,也可以通過其它方式構造,如:DOM。 XML文檔信息集由若干信息項組成,在這些信息集中必然包含一個文檔信息項和幾個其它的信息項

11、。信息項是對XML文檔中某個部分的抽象描述,每個信息項有一組相關的屬性。規范將XML信息集表示為一棵樹,但并不一定要用樹結構來構造XML信息集。在XML信息集樹中,文檔信息項是樹根,而處理指令,注釋和字符信息項作為葉子節點,元素信息項作為內部節點。另外,XML Infoset還定義了兩個屬性parent和children。parent屬性引用包含信息項,children屬性是子代的有序集合,根據信息集樹圖,文檔信息項沒有parent屬性,處理指令,注釋和字符信息項沒有children屬性,元素信息項可以同時具有這兩項屬性,盡管其children屬性可能為空。1.2.2 XML Infoset的

12、信息項 本文采用的XML Infoset是W3C2004年2月4日發布的推薦標準,本標準的一個信息集最多可包含11種不同類型的信息項,每個信息項都有若干屬性,每個屬性都被賦予一個名稱,屬性名用方括號括起來。這里只對與Xpath樹模型中的節點相應的信息項作一介紹,其余的信息項不作過多的說明。 文檔信息項 每個信息集有且只有一個文檔信息項,信息集中其余所有信息項都可以從文檔信息項的屬性以及屬性的屬性等來獲得。文檔信息項包含以下屬性: children:是一個子信息項的有序列表,此有序列表含有一個元素信息項,所有位于文檔元素(即XML文檔主體元素樹的根)外部的處理指令,注釋在此列表中都有一個相應的處

13、理指令信息項和一個注釋信息項,而位于DTD中的處理指令和注釋在本列表中沒有相應的信息項。如果XML文檔有文檔類型聲明,則在此列表中有一個文檔類型聲明信息項。document element:對應于文檔元素的元素信息項。notation:一個格式信息項的無序集合。所有在DTD中聲明的格式在本無序集合中都有一個相應的格式信息項。如果存在被多次聲明的格式,則該屬性沒有值。unparsed entities:一個非解析實體的無序集合。所有在DTD中聲明的非解析實體在本集合中都有一個非解析實體信息項。base URI:文檔實體的基準URI。character encoding scheme:文檔實體采用

14、的字符編碼方案的名稱。standalone:本屬性表明XML文檔是否是一個獨立的文檔。它的值是根據XML聲明中的獨立文檔聲明來設定的。如果沒有獨立文檔聲明,則該屬性沒有值。version:一字符串,表明文檔遵循的XML版本號。本屬性值是根據XML聲明中的版本信息來設定的,如果沒有聲明,則本屬性沒有值。all declarations processed:嚴格地說,本屬性不屬于文檔信息集的一部分,它僅表明XML處理器是否已經讀過了整個的DTD。本屬性的值是一個布爾值,取false或true。 元素信息項 對于出現在XML文檔中的每一個元素,在信息集中都有一個相應的元素信息項,其中必有一個文檔信息

15、項document element屬性的值,該元素信息項對應于元素樹的根,以該元素信息項為起點遞歸地訪問children屬性,可獲得其余所有元素信息項。元素信息項包含下列屬性:namespace name:元素類型的命名空間。如果元素不屬于任何命名空間,則本屬性沒有值。local name:元素類型名的本地名,本屬性不包括命名空間前綴和冒號。prefix:元素類型名的命名空間前綴。如果元素類型名沒有前綴,本屬性沒有值。children:一個子信息項的有序列表。此列表包含元素信息項,處理指令信息項,未展開實體引用信息項,字符信息項和注釋信息項。對于出現在當前元素中的每個元素,處理指令,對未展開外

16、部實體的引用,字符和注釋,在此列表中都有一個相應類型的信息項。對于空元素,此列表為空。attributes:一個屬性信息項的無序集合。對于元素的每個屬性(無論是顯式指定屬性值,還是根據DTD得到的缺省屬性值),在本集合中都有一個相應的屬性信息項。但元素的命名空間聲明不包括在此無序集合中。如果元素沒有屬性,則本集合為空。namespace attributes:一個屬性信息項的無序集合。對于元素的每個命名空間聲明(無論是顯式指定屬性值,還是根據DTD得到缺省屬性值),在該集合中都有一個相應的屬性信息項。取消缺省命名空間的聲明和取消前綴的聲明也被認為是一個命名空間聲明。所有的命名空間屬性都有一個命

17、名空間URI。如果元素沒有命名空間聲明,該無序集合為空。in-scope namespace:一個命名空間信息項的無序集。對于在元素范圍內有效的每個命名空間,在本無序集中都有一個相應的命名空間信息項。本無序集合總含有一個prefix屬性值為”XML”的命名空間信息項。命名空間前綴”XML”被隱式地綁定在命名空間/XML/1998/namespace上。本無序集合不包含prefix屬性值為”xmlns”的命名空間信息項,包含namespace attributes屬性中的所有命名空間信息項(除了那些代表xmlns=和xmlns:name=的命名空間信息項,因為它們沒有聲明命名空間,而是取消聲明缺

18、省命名空間或命名空間前綴)。在解析被限定名稱的命名空間前綴時,本屬性應優先于namespace attributes屬性被使用,因為在合成的信息集中這兩個屬性可能不一致。base URI:元素的基準URI。parent:本屬性值是一個文檔信息項或元素信息項,此信息項的children屬性包含本信息項。 屬性信息項 對于元素的每個屬性(無論是顯式指定屬性值,還是根據DTD得到缺省屬性值),包括命名空間聲明,都有一個相應的屬性信息項。一般屬性對應的屬性信息項出現在元素信息項的attributes中。既沒有缺省值又沒在使用時顯式指定屬性值的屬性沒有對應的屬性信息項。屬性信息項包含如下屬性:names

19、pace name:屬性的命名空間。對于不屬于任何命名空間的屬性,本屬性沒有值。local name:屬性的本地名。本屬性不含命名空間前綴和冒號。prefix:屬性名的命名空間前綴。對于不包含命名空間前綴的屬性名,本屬性沒有值。normalized value:規范化后的屬性值。specified:此屬性為一標記,它表示屬性值是在元素的首標簽中顯式指定,還是取自DTD中的缺省值。attribute type:屬性值的類型。屬性的合法類型有:ID, IDREF, IDREFS, ENTITIES, NMTOKEN, NMTOKENS, NOTATION, CDATA和ENUMERATION。對于

20、沒有聲明的元素,該屬性沒有值。如果尚未讀到聲明,并且文檔信息項的all declarations processed為false,則此屬性值為未知。此屬性的值不受屬性值有效性的影響。references:如果attribute type值為ID, NMTOKEN, NMTOKENS, CDATA或ENUMERATION,則此屬性沒有值;如果attribute type為未知,則此屬性值也為未知,否則本屬性值為一有序列表。該有序列表包含屬性值引用到的元素信息項,非解析實體信息項,格式信息項。owner element:此屬性值為一個元素信息項,它的attributes屬性包含本信息項。 處理指令

21、信息項 文檔中的每個處理指令都有一個相應的處理指令信息項,但XML聲明以及文本聲明不屬于處理指令。處理指令信息項有如下的屬性:target:此屬性值為一個字符串,表示PI的目標。content:此屬性值為一字符串,表示PI的內容。若PI沒有內容,則此屬性值為一空字符串。base URI:PI的基準URI。notation:此屬性為一格式信息項,該信息項的name屬性值與本PI信息項的target屬性值相同。如果該格式未被聲明或多次聲明,則本屬性沒有值;如果尚未讀到聲明,并且文檔信息項的all declarations processed屬性為false,則本屬性值為未知。parent:此屬性值

22、為一文檔信息項,元素信息項或文檔類型聲明信息項,該信息項的children屬性包含本信息項。 字符信息項 文檔中出現的每個數據字符(無論是字符引用還是CDATA段中的字符)都有一個相應的字符信息項。每個字符在邏輯上都是分開的信息項,但XML應用程序可以根據需要自由地將字符組織成更大的塊。字符信息項有如下的屬性:character code:字符對應的ISO10646字符代碼。element content whitespace:此屬性值為一布爾量,表明一個字符是否是元素內容中的空白。在字符不是空白的情況下,其值為false。parent:此屬性值為一元素信息項,該信息項的children屬性包

23、含本信息項。 注釋信息項 XML文檔中的每一個注釋(除了DTD中的外)都有一個相應的注釋信息項。注釋信息項包含如下的屬性:content:此屬性值為一字符串,它表示注釋的內容。parent:此屬性值為一文檔信息項或元素信息項,該信息項的children屬性值包含本信息項。 命名空間信息項 每個元素對應的元素信息項都有一個in-scope namespace屬性,對于在該元素范圍內有效的每個命名空間綁定在這個屬性中都有一個相應的命名空間信息項。命名空間信息項包含如下屬性:prefix:命名空間前綴。從語法上說,本屬性的值為屬性名中位于前綴“xmlns”后的部分。如果屬性名為“xmlns”(即聲明

24、缺省命名空間),則本屬性沒有值。namespace name:命名空間前綴對應的命名空間名。 其它信息項 在W3C2004年2月4日發布的XML Infoset推薦標準中,還有其它四種類型的信息項,它們是:格式信息項,非解析實體信息項,文檔類型聲明信息項和未展開實體引用信息項,這幾種信息項分別用于描述在DTD中聲明的每個格式,每個非解析一般實體,XML文檔中的文檔類型聲明以及每個尚未展開的對外部一般實體的引用。 2. Xpath 2.1 Xpath概述2.1.1 Xpath簡介 XML Infoset的定義暗示了給定的XML文檔中信息項的固有層次關系,這些固有的關系有助于對文檔子集尋址,然而,

25、XML Infoset并未定義尋址和標識這些子集的統一語法。 W3C在1999年11月16日發布了Xpath1.0的推薦標準,事實上,在同一天發布的還有XSLT1.0的推薦標準。Xpath1.0之所以能夠脫離XSLT1.0而單獨成為一個規范,是因為W3C認為許多其它的XML規范也需要對文檔的各個部分進行尋址訪問。如今,Xpath已成為很多XML相關規范的核心,如:Xpointer, XQuery等。 Xpath1.0是致力于為XSLT和Xpointer的公共功能提供一種共同的語法和語義的結果。Xpath的主要目的是對一個XML文檔進行尋址,為了支持這個目的,它也為操作字符串,數值和布爾值提供了

26、一些基本的功能。Xpath利用一個緊湊的,非XML的語法,來實現在URI和XML屬性值中的運用,它基于XML文檔的邏輯結構,而不是在它的表面語法上進行導航,用來定位XML文檔中各個部分和選擇文檔中的構成部件,如:元素,屬性,文本等。除了用來尋址外,Xpath自身的一個子集能夠用于匹配,即驗證一個節點是否匹配某個模式,Xpath的這種用法定義在XSLT的規范中。2.1.2 Xpath數據模型 Xpath數據模型簡介 如前所述,Xpath是運行在XML文檔的抽象邏輯結構上的,Xpath的尋址是基于一種節點樹模型,該模型將XML Infoset的相應信息項映射為樹模型中的節點(但該樹模型中的節點與X

27、ML Infoset的信息項并非一一對應),而XSLT也使用了與Xpath基本相同的數據模型。Xpath定義了七種節點類型,分別是:根節點,元素節點,屬性節點,文本節點,處理指令節點,注釋節點和名稱空間節點。在一個文檔的所有節點之間存在著一種稱之為文檔順序的順序,該順序對應于在XML文檔中每個節點的開始標記出現的順序,具體而言是:一個元素節點出現在它的所有孩子節點之前,元素的屬性節點和命名空間節點出現在該元素的所有孩子節點之前,其中命名空間節點出現在屬性節點之前,多個命名空間節點之間的相對順序依賴于實現,多個屬性節點之間的順序也依賴于是實現。下面,對Xpath樹模型中的七種節點作一介紹: 根節

28、點:根節點是文檔實體本身,它包含所有其它節點,是Xpaht樹模型的根。出現在XML文檔序言中以及文檔元素之后的處理指令和注釋直接作為根節點的孩子節點。元素節點:XML文檔中的每個元素都對應于樹模型中的一個元素節點,元素節點的孩子可以為元素節點,注釋節點,處理指令節點,命名空間節點以及其內容的文本節點。對內部或外部實體的實體引用將被展開,字符引用也被分解。屬性節點:每個元素節點都有一組相關的屬性節點。在XML標準中詳細說明了屬性節點的字符串值,它是一個規范化的值。命名空間節點:每個元素節點可以有相關的命名空間節點,它是在XML文檔中聲明的在元素范圍內有效的每個命名空間前綴(包括xml,它是由XM

29、L命名空間建議隱式地聲明的)以及默認命名空間。元素節點是它的每個命名空間節點的父節點。處理指令節點:除了文檔類型聲明中的處理指令以外,每個處理指令都對應一個處理指令節點。注釋節點:除了在文檔類型聲明中出現的注釋以外,每條注釋都對應著一個注釋節點。文本節點:XML源文檔中的字符數據構成文本節點,每個文本節點都包含盡可能多的字符數據,而且不會出現兩個相鄰的文本節點。考查如下的這個簡單的XML文檔: 2002 10000 該文檔的Xpath樹模型如下: Xpath樹模型到XML Infoset的映射 如前所述,Xpath定義了自己的數據模型,該模型是基于節點樹的。Xpath節點的屬性都可以通過對應的

30、XML Infoset信息項屬性來查看,例如:根節點與XML Infoset的文檔信息項相一致,其子節點映射到文檔信息項的children屬性,只包含三種類型的節點:元素節點,處理指令節點,注釋節點。而元素的屬性映射到元素信息項的attributes屬性,因此不被認為是元素節點的子節點。從Xpath樹模型到XML Infoset的映射如下:Xpath節點類型XML Infoset信息項根節點文檔信息項元素節點元素信息項屬性節點屬性信息項文本節點字符信息項序列處理指令節點處理指令信息項注釋節點注釋信息項名稱空間節點命名空間信息項 表 2-12.1.3 Xpath表達式 Xpath表達式簡介 表達

31、式是Xpath最基本的概念,Xpath表達式分為定位路徑表達式,布爾表達式,等式表達式,關系表達式和數值表達式,其中定位路徑表達式是Xpath表達式中最重要的一種類型,其余類型的表達式可以用于結果對象不需要是節點集的任何情況,通常出現在Xpath謂詞和各種XSLT結構中,如:xsl:if元素中。現對除定位路徑表達式外的表達式作一簡單介紹, 而定位路徑表達式將在下一節專門說明。布爾表達式:布爾表達式的操作符為or和and,Xpath支持標準的and/or布爾表達式,每個操作數被強制轉化為布爾值后求值。數值表達式:數值表達式使得實現數值的基本操作成為可能,其操作符有:+,-,*,div,mod,-

32、(一元操作符)。關系表達式:關系表達式使得兩個對象之間的比較成為可能,其操作符有:=,=,。關系表達式的求值是通過兩個操作數轉化為數值后進行比較求得的。如果其中一個操作數是節點集,則集合中的每個節點的數值同其它操作數的比較與等式表達式的相同,否則,先要將兩個對象都要轉化成數字,再依照IEEE754標準進行比較。等式表達式:等式表達式測試兩個對象是否相等,其操作符為=和!=。對等式表達式的結果定義如下:如果比較的兩個對象中有一個是節點集,若另一個對象是數值對象,則當節點集中有一個節點的字符串值轉化為數值時與該數值相等,則該節點集與此數值相等;當節點集中有一個節點的字符串值轉化為數值時與該數值不同

33、,則節點集與該數值不相等。若兩個比較的對象中一個是節點集,而另一個是字符串時,則當節點集中有一個節點的字符串值與該字符串值相同,則節點集與字符串相等;當節點集中有一個節點的字符串值與該字符串不相同,則節點集與該字符串不相等。如兩個比較的對象中一個是接點集,而另一個是布爾型時,則當將該接點集轉化為布爾型的結果與此布爾值相同,則接點集與該布爾值相等;當將接點集轉化為布爾型的結果與此布爾值不相同,則節點集與該布爾值不相等。如果比較的兩個對象都是節點集,則只要兩個節點集中分別有一個節點的字符串值相等,則兩個節點集相等;如果兩個節點集中分別有一個節點的字符串值不相等,則兩個節點集不等。如果比較的兩個對象

34、都不是節點集,但至少有一個是布爾類型時,那么每一個被比較的對象都要轉化為布爾型;若兩個對象都不是布爾型,但至少有一個對象是數值,那么每一個被比較的對象都要轉化為數值,否則,兩個對象都被轉化成字符串。當且僅當兩個布爾型值都為真或都為假時,稱布爾相等。當且僅當兩個字符串都由同樣序列的UCS字符組成時,稱字符串相當。而數值相等的比較依照IEEE754標準 Xpath表達式值的類型 Xpath為表達式的值定義了四種對象類型: 節點集:沒有重復節點的無序的節點集合 (node-set) 布爾值:true或false (Boolean) 數值 :浮點數據 (number) 字符串:UCS字符序列 (str

35、ing) Xpath表達式值的類型間的轉換 Xpath定義了四種類型值之間的強制轉換規則,這種轉換有時是自動完成的,有時則需要顯式的函數調用。具體如下:節點集的轉換規則布爾值: 空節點集被轉換為false,否則為true。數值 : 節點集先被強制轉換為字符串,然后在根據標準的IEEE字符串 到數值的轉換規則轉換為數值。空節點集將會得到NaN(表示不是一個數字)。字符串: 返回節點集中第一個節點的字符串值。Xpath規范定義了每種節 點類型的字符串值,具體如下:根節點:所有子孫文本節點的串聯。元素節點:所有子孫文本的串聯。屬性節點:規范化的屬性值。文本節點:該節點的字符數據。處理指令節點:處理指

36、令目標之后的字符數據。注釋節點:注釋分隔符內的字符數據。名稱空間節點:名稱空間URI。布爾值的轉換規則 數值: true轉換為1,false轉換為0。 字符串: true轉換為字符串值true,false轉換為字符串值false。數值的轉換規則 布爾值: 0轉換為false,其它轉換為true。 字符串: 轉換為數值的十進制格式。字符串的轉換規則 數值: 字符串被分析為十進制數字。 布爾值: 空字符串轉換為false,否則為true。 2.2 定位路徑表達式2.2.1 定位路徑表達式概述 定位路徑表達式簡介 如前所述,定位路徑是Xpath表達式中最主要的類型,它產生一個節點集。定位路徑表達式有

37、相對路徑和絕對路徑之分,也有縮寫形式和非縮寫形式之分,因此定位路徑表達式共有四種形態:非縮寫的絕對路徑,縮寫的絕對路徑,非縮寫的相對路徑,縮寫的相對路徑。定位路徑由一個或多個定位步組成,相鄰定位步之間用“/”分開。定位步確定了一個與上下文節點集相關的新的節點集,它針對上下文節點集中的每一個節點進行求值,并且結果集的合并成為下一定位步的上下文節點集。一個定位路徑表達式中的所有定位步按從左到右的順序一次一個地執行,最后一個定位步產生的節點集就是該定位路徑表達式的結果。每一個定位步包括:軸,節點測試和0或多個謂詞。定位步的計算從軸開始,然后是節點測試,最后進行謂詞的過濾,最后的結果節點集合就是該定位

38、步的選擇結果 。如果定位路徑是絕對的,則初始的上下文節點集包含根節點,否則,它包含當前上下文節點。 Xpath中的上下文 Xpath中的上下文可定義為:正在處理的當前節點。而上下文節點集合的定義是:表達式中給定點確定的當前節點集。Xpath中的上下文實際是由這個上下文節點的五個部分組成的,其中上下文節點具有關鍵的作用,其余部分的定義都與上文節點有關。上下文的五個組成部分是: 節點:即上下文節點。 一對非零的正整數:即上下文的位置和上下文的大小。 一個變量綁定集合:在表達式所屬屬性的元素范圍內定義變量綁定集合,允許從變量名到變量值的映射。 一個函數庫:由函數名到函數的映射組成,表達式可以使用所有

39、Xpath核心函數。 用于表達式的命名空間聲明的集合。需要補充的一點是:上下文節點與當前節點一般來說是一致的,但有時也不相同,如:在定位路徑表達式的謂詞判斷中。2.2.2 軸 軸在定位步中用于指定通過定位步其余部分(節點測試和謂詞)篩選的初始節點集,每個軸都標識了一個相對于上下文節點的接點集,同時也有一個指定的方向,正向軸始終標識上下文節點以及按文檔順序排列在上下文節點之后的節點,反向軸始終標識上下文節點以及按文檔順序排列在上下文節點之前的節點。每一個軸都有一個主要節點類型,attribute軸的主要節點類型是屬性節點,namespace軸的主要節點類型是名稱空間節點,其余軸的主要節點類型均為

40、元素節點。主要節點很重要,因為按名稱執行的節點測試將只產生主要節點類型的節點。Xpath共定義了13種軸,具體如下: self:確定上下文節點。 child:確定上下文節點的子節點。當軸被省略時,默認為child。須注意的是屬性節點和名稱空間節點不是與它們相關的元素節點的子節點。 parent:確定上下文節點的父節點。根元素無父節點。 descendant:確定上下文節點的所有后代節點,該軸不選擇屬性節點和名稱空間節點。 descendant-or-self:確定上下文節點及其所有后代節點。 ancestor-or-self:確定上下文節點及其祖先。 ancestor:確定上下文節點的所有祖先

41、節點,包括父節點,父節點的父節點等。根節點無父節點。 following:確定文檔順序中所有在上下文節點之后的節點,但不包括屬性節點,名稱空間節點以及上下文節點的后代節點。 preceding:確定文檔順序中所有在上下文節點之前的節點,但不包括屬性節點,名稱空間節點以及上下文節點的祖先節點。 following-sibling:確定文檔次序中所有在上下文節點之后的兄弟節點。如果上下文節點是屬性節點或名稱空間節點,則該軸為空。 preceding-sibling:確定文檔順序中所有在上下文節點之前的兄弟節點。如果上下文節點是屬性節點或名稱空間節點,則該軸為空。 attribute:確定上下文節點

42、的所有屬性節點。屬性軸可能為空,除非這個上下文節點是一元素。 namespace:確定上下文節點的所有名稱空間節點。名稱空間軸可能為空,除非這個上下文節點為一元素。2.2.3 節點測試 節點測試用于確定軸中的節點。如果給定的節點測試值為true,則它保留在節點集中,否則把它從節點集中刪除。可以使用節點名稱或節點類型兩種方式進行節點測試。 在使用節點名稱進行節點測試時,所有非指定軸主要節點類型的節點都將被拋棄,剩下的節點的名稱將與定位步中指定的限定名(Qname,前綴:本地名)或通配符進行比較,Qname被擴展為一個命名空間名稱(本地名稱+命名空間URI),對于上下文節點的軸主要類型節點集中的每

43、一個節點,如果與限定名的擴展名稱相匹配,則保留在結果集中,否則刪除。 Xpath處理程序為了將限定名Qname擴展成帶命名空間URI的擴展名,需要訪問命名空間綁定。因此Xpath處理程序需要提供創建命名空間綁定的機制,它將在對表達式求值時用到。在XSLT中,這可以通過標準的XML1.0命名空間聲明來完成。 節點測試的通配符“*”也可以用來確定所有的具有軸的主要節點類型的節點,這個通配符還可以用來與命名空間前綴相連,其形式為“NCName:*”,以確定所有來自給定命名空間中的節點。 如果具有特定的類型,則可以使用類型進行節點測試,Xpath定義了多個用于節點測試的節點類型標識符。對于任何文本節點

44、,節點測試text()為真;對于任何注釋節點,節點測試comment()為真;對于任何處理指令節點,節點測試processing-instruction()為真;對于任何節點,節點測試node()為真。2.2.4 謂詞 對于經過了軸和節點測試過濾后的節點集中的每一個節點,可以用謂詞作進一步的篩選,謂詞表達式將此節點作為上下文節點進行求值,其結果被強制轉化為布爾型,如果結果為true,則該節點保留在節點集中,否則將被刪除。當然謂詞是可選的。 謂詞可以是任意的基本表達式。對于謂詞表達式可以分四種情況加以說明: 當表達式為空時,謂詞為false。 當表達式是一個至少包含一個整數的整數序列時,則當上下

45、上下文節點的位置與這個序列中某個整數相當時謂詞為true,否則為false。 當表達式的結果是邏輯值時,則謂詞與表達式的值相一致。 當表達式是一個至少包含一個節點的節點集時,謂詞為true。即謂詞的取值與節點內容無關。2.2.5 定位路徑表達式的縮寫形式 如前所述,定位路徑表達式有多種形態,有必要說明一下的是定位路徑的縮寫形式,因為縮寫形式比非縮寫形式更常用,更簡潔。Xpath定義了多個用于構建定位路徑的表達式的縮寫,這可用于URI片段標識符(如:Xpointer)和XML的屬性值中。可以縮寫的語法結構和其相應的縮寫形式如下:非縮寫的形式縮寫形式Child:省略Attribute:Self:n

46、ode().Parent:node()./descendant-or-self:node()/position()=數字數字 表 2-22.3 Xpath函數 Xpath定義了所有的實現都要支持的核心函數庫,有3個顯式地進行Xpath數據類型之間轉換的函數:string(), number(), Boolean()(注:不能夠強制轉換string, number, boolean為節點集)。如果函數期望使用特定類型的參數和不同類的對象,則隱式地將其轉換期望的類型,就好象調用了相應的類型轉換函數一樣。函數可以定義為表達式的唯一部分,可在謂詞中使用,也可以在XSLT的屬性值模板中使用。 Xpath

47、核心函數庫中的所有函數都屬于非命名空間,因此它們的名稱不需要命名空間前綴。Xpath工具可以通過適當的擴充來增大這個核心函數庫,在擴充時,擴充的函數名稱必須是具有命名空間前綴的限定名。在函數庫中的每一個函數都使用一個函數原型,該原型給定返回類型,函數名稱以及函數參數的類型 。如果參數類型后跟隨一個問號,則表明該參數是可選的,否則該參數是必須的。下面將Xpath核心函數庫中的函數分類作一介紹。2.3.1 節點集函數number last() 該函數返回上下文節點集合中節點的數目。number position() 該函數返回一個數值,該數值等于上下文節點在上下文節點集中的索引值,即上下文節點在上

48、下文節點集中的位置,其值最小為1。number count(node-set) 該函數返回參數node-set節點集中節點的個數。node-set id(object) 該函數返回用唯一的ID確定的節點集(需要DTD或XML schema的支持)。Id函數的具體操作依賴于參數對象的類型。當參數是節點集時,結果是對參數節點集中的每個節點的字符串值應用id函數結果的并集;當參數是其它任何類型時,參數首先轉換為字符串,然后分割為用空白隔開的助記符的列表,結果是在同一文檔中id值等于列表中任何一個助記符的元素節點的集合。string local-name(node-set?) 該函數按文檔順序返回參數

49、節點集中第一個節點的擴展名的本地名稱。如果參數節點集為空或第一個節點沒有擴展名,則返回一個空字符串,如果參數省略,則默認將上下文節點作為節點集中的惟一成員。string namespace-uri(node-set?) 該函數返回參數節點集中第一個節點的擴展名的名稱空間URI。如果參數節點集為空,或第一個節點沒有擴展名,或擴展名的名稱空間URI為空,則返回一個空字符串,如果參數被省略,則默認把上下文節點作為節點集的唯一成員。string name(node-set?) 該函數按照文檔順序返回參數節點集中第一個節點的QName。如果參數節點集是空或第一個節點沒有限定名,則返回一個空字符串,如果省

50、略參數,則默認將上下文節點作為節點集中的唯一成員。2.3.2 字符串函數string string(object?) 該函數將參數轉化為字符串,如果參數被省略,則默認將上下文節點作為節點集中的唯一成員,當參數非空時,轉換的細節依賴于參數對象的類型,現分列如下:如果參數是節點集,則返回節點集中第一個節點的字符串值,如果節點集為空,則返回空字符串。如果參數是數字,則按如下方式轉換:NaN轉換成字符串“NaN”。0或負0轉換成字符串“0”。正無窮大轉換成字符串“Infinity”。負無窮大轉換成字符串“-Infinity”。如果數字是正整數,則轉換成一個無小數點以及打頭0的十進制形式的字符串;如果是

51、負整數,則在其前面加一個負號;如數字是正的非整數,則該數字轉換成一個包含小數點以及至少在小數點前面有一位數字的十進制的字符串;如數字是負的非整數,則在其前面加一個負號。如果參數是布爾值假,則轉換成字符串“false”;如果參數是布爾值真,則轉換成字符串“true”。如果參數不是四種基本類型的對象,則依照所屬類型的方式轉換成字符串。 string concat(string, string, string*) 該函數返回參數的聯接。boolean contains(string, string) 如果第一個字符串包含第二個字符串,該函數返回真,否則返回假。boolean starts-with(

52、string, string) 如果第一個字符串參數以第二個字符串參數為開頭,則該函數返回真,否則返回假。string substring-before(string, string) 該函數返回第二個字符串在第一個字符串中首次出現之前的子串,如果第一個字符串不包含第二個字符串,則返回空字符串。string substring-after(string, string) 該函數返回第二個字符串在第一個字符串中首次出現之后的子串,如果第一個字符串不包含第二個字符串參數,則返回空字符串。string substring(string, number, number?) 該函數返回第一個字符串中從第

53、二個參數所指定的位置開始,以第三個參數為長度的子字符串。如果沒有第三個參數,則返回從第二個參數所指定的位置開始第一個字符串參數其余的部分。number string-length(string?) 該函數返回字符串參數中的字符個數,若參數省略,則默認為上下文節點的字符串。string normalize-space(string?) 該函數返回空白字符規范化后的參數字符串,該規范化是清除前導,結尾的空白以及用一個空白字符替換連續的空白字符。如果參數省略,則默認為上下文節點的字符串值。string translate(string, string, string) 該函數返回第一個參數字符串中的

54、字符串,其中在第二個參數字符串中出現的字符都被在第二個參數字符串中相對應的字符所取代。如:translate(“bar”, “abc”, “ABC”)返回字符串為“Bar”。如果第二個參數里的字符在第二個參數的相應位置沒有字符,那么,第一個參數里的那個字符將被刪除,如:translate(“-abd-”, “abc”, “ABC”)返回字符串“ABd”。如果在第二個參數里的字符出現超過一次,那么將用第一次出現的字符進行替換,如果第三個參數里的字符串比第二個參數的字符串長,那么將忽略多余的字符。2.3.3 布爾函數boolean Boolean(object) 該函數將參數轉換為布爾型。轉換的細

55、節依賴于參數的類型,具體如下:當參數是節點集時,若節點集非空返回true,否則返回false。當參數為字符串時,若字符串長度非0返回true,否則返回false。當參數為數值時,若數值非正,負0或NaN時,返回true,否則返回false。當參數為其它類型時,則根據其所屬類型的方式轉換成布爾型。boolean not(boolean) 如果參數為true,則返回false,否則返回true。boolean true() 該函數總返回真。boolean false() 該函數總返回假。2.3.4 數值函數number number(object?) 該函數將參數轉換為數值。如果參數省略,則默認為

56、是僅有一個上下文節點的節點集合。轉換的細節依賴于參數的類型,具體如下:當參數為節點集時,首先將其轉換為字符串,然后這個字符串按照字符串的規則轉換為數值。當參數為字符串時,將其轉換為IEEE754浮點數。如果參數字符串不代表數值,則返回NaN。當參數為布爾型時,真轉換為1,假轉換為0。當參數為其它類型時,則依賴其所屬類型的方式轉換成數字。number sum(node-set) 該函數返回參數節點集中的每個節點的字符串值轉換成數字后的和。number floor(number) 該函數返回不大于參數的最大整數。number ceiling(number) 該函數返回不小于參數的最小整數。numb

57、er round(number) 該函數返回最接近于參數的整數。如果有兩個這樣的數,那么返回最接近于正無窮大的那個;如果參數為NaN,那么返回NaN;如果參數是正無窮大,那么返回正無窮大;如果參數是負無窮大,那么返回負無窮大;如果參數是正0,那么返回正0;如果參數是負0,那么返回負0;如果參數小于0,但大于或等于-0.5,那么返回負0。 3. XSLT 3.1 XSLT概述3.1.1 XSLT簡介 最初,XSLT是作為XSL(extensible stylesheet language)的一部分出現的。XSL標準定義了2個單獨的處理過程,其中第一個處理過程是轉換,定義如何操作文檔;第二個處理過

58、程是表示,定義如何在不同的用戶代理中顯示XML文檔。然而由于二者發展的不平衡,XSL工作組最終把XSL標準劃分為2個單獨的規范文檔:XSLT(XSL-Transformation)和XSL-Fo(XSL-Formatting object)。 XSLT是一種基于XML的語言,用于描述將XML文檔轉換成任意基于文本的格式(可以是XML,HTML,text,RTF等)。XSLT的功能非常強大,我們可以把它視為一種編程語言,XSLT執行引擎將XSLT文檔作為程序直接執行。XSLT的編程模型可以分為三種:基于原型的,程序性的以及說明性的。基于原型的模型允許用戶采用XML模板,然后使用XSLT的編程結構

59、填充該模板以便在合適的位置生成動態的內容。程序性的模型允許在XSLT中可以象在程序性編程語言中調用函數那樣調用模板,這可以通過XSLT中定義的元素xsl:template和xsl:call-template實現。最后XSLT提供了一個有效并且靈活的說明性編程模型,該模型是基于關聯的且具有與輸入文檔相關的模式的模板,它允許開發者將轉換邏輯分成與輸入文檔的某一部分自動關聯的模塊,開發者不必擔心何時調用以及如何調用模塊,相反,只需簡單的聲明對于特定節點應該調用哪個給定的模板,處理程序就會決定何時以及如何做,這可以通過運用XSLT中定義的元素xsl:template, xsl:apply-templa

60、tes, xsl:apply-imports等來實現。說明性編程模型的執行過程是:處理程序首先查找具有匹配輸入節點樹根的模式的模板,然后在模板中可以指定需要處理程序利用xsl:apply-templates或xsl:apply-imports等元素繼續處理的節點,在調用了xsl:apply-templates或xsl:apply-imports之后,處理程序確定并執行最為匹配每個指定節點的模板。該操作直到處理程序到達一個沒有顯式調用xsl:apply-templates或xsl:apply-imports的模板為止。基于原型的編程模型只允許輸出XML或HTML,而后兩種模型使得輸出XML, H

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論