<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Mongoose House

    Technical Edition

    統(tǒng)計

    留言簿(4)

    積分與排名

    閱讀排行榜

    XML 路徑語言(XPath) 版本 1.0

    XML 路徑語言(XPath) 版本 1.0

    萬維網(wǎng)協(xié)會 (W3C) 建議 1999November16

    本版本:
    http://www.w3.org/TR/1999/REC-xpath-19991116 (其它文件格式: XML [英文] HTML [英文] )
    最新版本:
    http://www.w3.org/TR/xpath 中文翻譯 [簡體中文]
    以前版本:
    http://www.w3.org/TR/1999/PR-xpath-19991008
    http://www.w3.org/1999/08/WD-xpath-19990813
    http://www.w3.org/1999/07/WD-xpath-19990709
    http://www.w3.org/TR/1999/WD-xslt-19990421
    編者:
    James Clark <jjc@jclark.com>
    Steve DeRose, Inso Corp. and Brown University <Steven_DeRose@Brown.edu>

    摘要

    XPath 是一種用于對 XML 文檔的元件尋址的一語言,設(shè)計為 XSLT 和 XPointer 使用。

    本文檔的地位

    本文檔已由萬維網(wǎng)協(xié)會 (W3C) 組織成員和其他感興趣的各方審閱,并已被組織理事批準為萬維網(wǎng)協(xié)會 (W3C) 建議。這是一個穩(wěn)定的文檔,可以用作參考材料,也可以作為其他文檔的標準參考文獻。W3C 在建議制定過程中的作用是吸引對本規(guī)范的注意并促進它的廣泛使用。這能增強 Web 的功能和互操作性。

    本規(guī)格說明已知的錯誤列表在 http://www.w3.org/1999/11/REC-xpath-19991116-errata

    對本說明的建議可電郵到 www-xpath-comments@w3.org存檔的建議可供備查。

    英文版是唯一的正式版,本文檔的翻譯請參見 http://www.w3.org/Style/XSL/translations.html

    現(xiàn)有 W3C 建議和其他技術(shù)文檔的列表在 http://www.w3.org/TR

    本規(guī)格是 XSL 工作組及 XML 鏈接工作組聯(lián)合的工作成果,因此也是 XML 式樣制定工作(W3C Style activity)W3C XML 制定工作(W3C XML Activity)的一部分。


    1 緒論

    XPath 是努力給 XSL 轉(zhuǎn)換[XSLT]和 XPointer [XPointer]的共享功能提供一個共用的句法及語義的結(jié)果。XPath的主要的目是用于對 XML [XML]文檔元件尋址。在支持這個主要目的的同時,它也為字符串,數(shù)字和布爾的操作提供了基本手段。XPath 使用簡明的、非 XML 句法以便於在 URIs 和 XML 屬性值以內(nèi)使用 XPath,XPath 對 XML 文檔的抽象的、邏輯的結(jié)構(gòu)而非它的表面句法進行操作,XPath 的名字源于它在 URL 中用作對 XML 文檔的層次的結(jié)構(gòu)進行導航一個路徑標志。

    除了用做尋址外,XPath 也被設(shè)計成以便它有能被用于匹配的一個自然的子集(測試一個節(jié)點是否匹配一個模式);XSLT中描述了 XPath 在這方面的使用。

    XPath 將一個 XML 文檔建模成為一棵節(jié)點樹,有不同類型的節(jié)點,包括元素節(jié)點,屬性節(jié)點和正文節(jié)點。XPath 定義了一種方法來計算每類的節(jié)點的字串值。一些節(jié)點的類型也有名字。XPath 充分支持 XML 命名空間[XML Names]。這樣,節(jié)點的名字被建模成由一個局城部分和可能為空的命名空間 URI 組成的對;這被稱為擴展名5 數(shù)據(jù)模型描述了數(shù)據(jù)模型詳細細節(jié)。

    XPath的主要語法構(gòu)件是表達式,一個表達式匹配產(chǎn)生式 Expr,一個表達式被求值評估產(chǎn)出一個對象,該對象有下列 4 種基本的類型之一:

    節(jié)點集合(無序的、無重復的節(jié)點集合)
    布爾(真或假)
    數(shù)字(一個浮點數(shù)字)
    字符串(UCS 字符的順序)

    表達式求值發(fā)生與上下文有關(guān)。XSLT 和 XPointer 分別地指定了上下文怎樣在 XSLT 和 XPointer 使用 XPath 表達式。上下文組成包括:

    一個節(jié)點([定義上下文節(jié)點])
    一對非零正整數(shù)([定義上下文位置]和[定義上下文大小])
    一個變量綁定的集合
    一個函數(shù)庫
    表達式范圍內(nèi)的命名空間聲明的集合

    上下文位置總是小於或等於上下文的大小。

    綁定由從變量名到變量值映射組成,一個變量的值是一個對象,它的類型可以是任何表達式的值可能的類型,并且也可以有這里沒指定的另外的類型。

    函數(shù)庫由從函數(shù)名到函數(shù)的映射組成,每個函數(shù)可接受零個或零個以上的參數(shù)并且返回單個的結(jié)果。本文檔定義了所有的 XPath 實現(xiàn)必須支持的一個核心函數(shù)庫(參看4 核心函數(shù)庫)。對於核心函數(shù)庫中的每一個函數(shù),參數(shù)和結(jié)果有4種基本的類型。XSLT 和 XPointer 通過定義另外的函數(shù)來擴展 XPath 的函數(shù);這些函數(shù)有些對 4 種基本的類型操作,其它的則對 XSLT 和 XPointer 定義的另外的數(shù)據(jù)類型操作。

    命名空間聲明由從前綴到命名空間 URI 的映射組成。

    變量綁定、函數(shù)庫及命名空間聲明對於求表達式或其子表達式的值總是一樣的;上下文節(jié)點、上下文位置及大小對於求表達式或其子表達式的值則是不同的。有多種表達式可改變上下文節(jié)點,而只有判定詞能改變上下文位置和上下文大小(參看2.4 判定詞)。在描述一種表達式的求值時,必須總是明確地說明是上下文節(jié)點、上下文位置、還是上下文的大小對子表達式的求值產(chǎn)生變化,如果沒有關(guān)于上下文節(jié)點、上下文位置、上下文的大小的說明,那么對那種表達式的子表達式的求值就保持不變。

    XPath 表達式經(jīng)常出現(xiàn)在 XML 屬性里,在本節(jié)中說明的語法適用于在 XML 1.0 規(guī)范化以后的屬性值。因此,如果語法要使用字符 <,而該字符卻絕對不能以 < 出現(xiàn)在任何的 XML 資料中,這樣必須遵循 XML 1.0 的規(guī)則,也就是應(yīng)鍵入成 &lt;。在表達式以內(nèi),文字的字符串由單引號或雙引號來界定,它也用于界定 XML 屬性。為了避免 XML 處理器將表達式中的引號解釋成屬性界定符,引號可以鍵入成字符參考( &quot;&apos; )。做為選擇,如果 XML 屬性使用雙引號,表達式則可以使用單引號,反之亦然。

    一種重要的表達式類型是地點路徑,地址路徑選擇與上下文節(jié)點相關(guān)的節(jié)點集合。對是地址路徑的表達式求值的結(jié)果是節(jié)點集合,該節(jié)點集合包含地點路徑選擇的節(jié)點。地址路徑能遞歸地包含表達式,這些表達式用來過濾節(jié)點集合。地址路徑與此同時LocationPath 相匹配。

    在下列語法里,非終結(jié)的 QNameNCName 定義在[XML Names]中,而S定義在[XML]中。語法與[XML]一樣使用 EBNF 符號表示法(除了總是以大寫字母起頭的語法符號)。

    分析表達式時,首先將字符字符串分解成分割段(token),然后再分析所得分割段結(jié)果的序列。空白符能自由地在分割段之間被使用。分段化(tokenization)過程在3.7 詞法結(jié)構(gòu)中描述。

    2 地址路徑

    盡管地址路徑不是本語言中最完整的語法的構(gòu)件(地址路徑 LocationPathExpr 的一個特殊的例子),他們卻是最重要的構(gòu)件,因此,將首先進行描述。

    每一條地址路徑都能使用直觀但是相當冗長的句法表示,同時也有很多縮簡句法可用以簡明地表示常見路徑。這節(jié)將解釋使用未經(jīng)縮寫的句法的地址路徑的語義。然后將通過顯示縮簡的句法怎擴展成未經(jīng)縮寫的句法來解釋縮簡句法(看2.5 縮簡句法)。

    這是使用未經(jīng)縮寫的句法的地址路徑的一些例子:

    • child::para 選擇上下文節(jié)點的 para 元素孩子

    • child::* 選擇上下文節(jié)點的所有元素孩子

    • child::text() 選擇上下文節(jié)點的所有的正文節(jié)點

    • child::node() 選擇上下文節(jié)點的所有的孩子,而不論它們是什么節(jié)點類型

    • attribute::name 選擇上下文節(jié)點的 name 屬性

    • attribute::* 選擇上下文節(jié)點的所有的屬性

    • descendant::para 選擇上下文節(jié)點的 para 元素子孫

    • ancestor::div 選擇上下文節(jié)點的 div 祖先

    • ancestor-or-self::div 選擇上下文節(jié)點的 div 祖先,并且,如果上下文節(jié)點為 div 元素,則該上下文節(jié)點也被選擇

    • descendant-or-self::para 選擇上下文節(jié)點中所有的 div 元素子孫,而且,如果上下文節(jié)點是一個 div 元素,則該上下文節(jié)點也被選擇

    • self::para 如果上下文節(jié)點是一個 para 元素,選擇該上下文節(jié)點,否則不選擇任何東西

    • child::chapter/descendant::para 選擇上下文節(jié)點的 chapter 元素孩子的所有的 para 元素子孫

    • child::*/child::para 選擇上下文節(jié)點的所有的 para 孫子

    • / 選擇文檔根(它總是是文檔元素的父)

    • /descendant::para 選擇在同一文檔中所有的 para 元素作為上下文節(jié)點

    • /descendant::olist/child::item 選擇在同一文檔中所有的以 olist 為父的 item 元素作為上下文節(jié)點

    • child::para[position()=1] 選擇上下文節(jié)點的第一個 para 孩子

    • child::para[position()=last()] 選擇上下文節(jié)點的最后一個 para 孩子

    • child::para[position()=last()-1] 選擇上下文節(jié)點的倒數(shù)第二個 para 孩子

    • child::para[position()>1] 選擇上下文節(jié)點中除第一個以外所有的 para 孩子

    • following-sibling::chapter[position()=1] 選擇上下文節(jié)點的下一個 chapter 兄弟

    • preceding-sibling::chapter[position()=1] 選擇上下文節(jié)點的前一個 chapter 兄弟

    • /descendant::figure[position()=42] 選擇文檔中第四十二個 figure 元素

    • /child::doc/child::chapter[position()=5]/child::section[position()=2] 選擇文檔元素 doc 的第五個 chapter 的第二個 section

    • child::para[attribute::type='warning"] 選擇的上下文節(jié)點中有屬性 type 且值為 warningpara 孩子

    • child::para[attribute::type='warning'][position()=5] 選擇的上下文節(jié)點中所有的有屬性 type 且值為 warningpara 孩子中第五個孩子

    • child::para[position()=5][attribute::type="warning"] 選擇的上下文節(jié)點中第五個 para 孩子,如果該孩子有 type 屬性且值為 warning 的話

    • child::chapter[child::title='Introduction'] 選擇的上下文節(jié)點的 chapter 孩子,這些孩子有一個或一個以上字串值等於 Introductiontitle 孩子

    • child::chapter[child::title] 選擇的上下文節(jié)點中有一個或一個以上 title 孩子的 chapter 孩子

    • child::*[self::chapter or self::appendix] 選擇上下文節(jié)點的 chapterappendix 孩子

    • child::*[self::chapter or self::appendix][position()=last()] 選擇上下文節(jié)點的最后一個 chapterappendix 孩子

    地址路徑有兩種:相對的地址路徑和絕對的地址路徑。

    相對的地址路徑由以 / 分開的一個或多個地點步進序列組成。在相對地址路徑中的步進是從左到右組成。每一步進依次選擇相對於上下文節(jié)點的節(jié)點集。步進的初始的序列以如下所述的方式與后續(xù)的步進組成在一起。步進的初始的序列選擇相對於上下文節(jié)點的節(jié)點集,該集合的每一節(jié)點成為后續(xù)步進的上下文節(jié)點。由步進確定的節(jié)點的集合是聯(lián)合在一起的。由合成的步進確定的節(jié)點的集合也是這樣的聯(lián)合。例如,child::div/child::para 選擇了上下文節(jié)點的所有 div 元素孩子的所有 para 元素孩子,或者換句話說,選擇了上下文節(jié)點中所有有以 div 為父 para 元素孫子。

    絕對的地址路徑由 / 及緊隨其后的作為可選項的一條相對地址路徑組成。 / 本身選擇以包含上下文節(jié)點的文檔的根節(jié)點,如果它帶著相對的地址路徑,該地址路徑選擇的節(jié)點集合則由相對於包含上下文節(jié)點的文檔的根節(jié)點相對地址路徑來確定。

    地址路徑
    [1]??? LocationPath ???::=??? RelativeLocationPath
    | AbsoluteLocationPath
    [2]??? AbsoluteLocationPath ???::=??? '/' RelativeLocationPath?
    | AbbreviatedAbsoluteLocationPath
    [3]??? RelativeLocationPath ???::=??? Step
    | RelativeLocationPath '/' Step
    | AbbreviatedRelativeLocationPath

    2.1 地點步進

    一個地點步進有三個部分:

    • 一個軸,它指定了地點步進選擇的節(jié)點與上下文節(jié)點之間樹狀關(guān)系,

    • 一個節(jié)點測試,它指定地點步進選擇的節(jié)點的節(jié)點類型以及節(jié)點擴展名擴展名,和

    • 零個或零個以上的判定詞,它使用專有的表達式進一步細化地點步進選擇的節(jié)點集合。

    地點步進的句法是由兩個冒號分開的軸名和節(jié)點測試,其后可跟隨零個或零個以上在方括符內(nèi)的表達式。例如,在 child::para[position()=1] 中,child 是軸名,para 是節(jié)點測試而 [position()=1] 則是判定詞。

    由地點步進選擇的節(jié)點集合是源于從軸和節(jié)點測試產(chǎn)生初始的節(jié)點集合,然后再由各個判定詞的依次過濾后的節(jié)點集合。

    初始的節(jié)點集合的節(jié)點組成,這些節(jié)點與上下文節(jié)點關(guān)系由軸指定的,其節(jié)點類型及擴展名由節(jié)點測試指定。例如,地點步進 descendant::para 選擇上下文節(jié)點的 para 元素子孫: descendant 指定在初始的節(jié)點集合中的那每一個節(jié)點都必須是該上下文的一個子孫; para 指定在初始的節(jié)點集合中的每一個節(jié)點都必須是 para 元素。2.2 軸說明了所有可能的軸。2.3 節(jié)點測試則說明了所有可能的節(jié)點測試。一些節(jié)點測試的含意依賴于軸。

    初始的節(jié)點集合由第一個判定詞過濾后產(chǎn)生一新的節(jié)點集合,新的節(jié)點集合再由第二個判定詞進行過濾,如此一直下去。最后的節(jié)點集合是由地點步進選擇的節(jié)點集合。軸影響在每個判定詞中的表達式怎么被求值,并且因此判定詞的語義定義與軸關(guān)于。參看2.4 判定詞

    地點步進
    [4]??? Step ???::=??? AxisSpecifier NodeTest Predicate *
    | AbbreviatedStep
    [5]??? AxisSpecifier ???::=??? AxisName '::'
    | AbbreviatedAxisSpecifier

    2.2 軸

    以下是可用到的軸:

    • child 軸包含上下文節(jié)點的孩子

    • descendant 軸包含上下文節(jié)點的子孫;子孫是一個孩子或一個孩子的一個孩子,等等,這樣,子孫軸從來不包含屬性或命名空間節(jié)點

    • parent 軸包含上下文節(jié)點的父,如果有的話

    • ancestor 軸包含上下文節(jié)點的祖先;上下文節(jié)點的祖先由上下文節(jié)點的父以及父的父等等組成;這樣,祖先軸將總是包括根節(jié)點,除非上下文節(jié)點是根節(jié)點

    • following-sibling 軸包含上下文節(jié)點的所有在其后的兄弟,如果上下文節(jié)點是屬性節(jié)點或命名空間節(jié)點,following-sibling 軸則為空

    • preceding-sibling 軸包含上下文節(jié)點的所有在其前的兄弟,如果上下文節(jié)點是屬性節(jié)點或命名空間節(jié)點,preceding-sibling 軸則為空

    • following 軸包含在上下文節(jié)點所在的同一文檔中,所有依照文檔順序在上下文節(jié)點后的節(jié)點,但排除所有的子孫,也排除屬性節(jié)點以及命名空間節(jié)點

    • preceding 軸包含在上下文節(jié)點所在的同一文檔中,所有依照文檔順序在上下文節(jié)點前的節(jié)點,但排除所有的子孫,也排除屬性節(jié)點以及命名空間節(jié)點

    • attribute 軸包含上下文節(jié)點的屬性,除非上下文節(jié)點是元素,該軸將為空

    • namespace 軸包含上下文節(jié)點的命名空間節(jié)點,除非上下文節(jié)點是元素,該軸將為空

    • self 軸只是包含上下文節(jié)點自己

    • descendant-or-self 軸包含上下文節(jié)點和上下文節(jié)點的子孫

    • ancestor-or-self 軸包含上下文節(jié)點和上下文節(jié)點的祖先;這樣,該軸將總是包括根節(jié)點

    注意:

    ancestordescendantfollowingpreceding 以及 self 軸劃分了一個文檔(忽略屬性和命名空間節(jié)點):他們相互不重疊,而且他們組在一起則包含了文檔所有的節(jié)點。

    [6]??? AxisName ???::=??? 'ancestor'
    | 'ancestor-or-self'
    | 'attribute'
    | 'child'
    | 'descendant'
    | 'descendant-or-self'
    | 'following'
    | 'following-sibling'
    | 'namespace'
    | 'parent'
    | 'preceding'
    | 'preceding-sibling'
    | 'self'

    2.3 節(jié)點測試

    定義:每個軸都有一個基本節(jié)點類型。如果軸能包含元素,基本的節(jié)點類型則是元素;否則,它的類型是軸能包含的節(jié)點的類型。]因此,

    對於屬性軸來說,基本的節(jié)點類型是屬性。
    對於命名空間軸,基本的節(jié)點類型是命名空間。
    對於其它的軸,基本的節(jié)點類型是元素。

    當且僅當節(jié)點的類型(參看5 數(shù)據(jù)模型)是基本類型且擴展名等於由 QName 指定的擴展名時,為 QName 節(jié)點測試才為真。例如,child::para 選擇了上下文節(jié)點的 para 元素孩子,如果上下文節(jié)點沒有 para 孩子,它將選擇節(jié)點的一個空集合;attribute::href 選擇了上下文節(jié)點的 href 屬性,如果上下文節(jié)點沒有 href 屬性,它將選擇節(jié)點的一個空集合。

    使用來自表達式的上下文的命名空間聲明,在節(jié)點測試里的 QName 可擴展成擴展名。這與在起始及結(jié)束標簽中元素類型名稱的擴展方法一樣,除了缺省的 xmlns 命名空間申明無須使用外:如果 QName 沒有前綴,則命名空間 URI 為空 (這與屬性名字擴展的方法一樣)。如果 QName 有前綴,而表達式上下文中卻沒有命名空間聲明,則是一個錯誤。

    對於基本節(jié)點類型的任何節(jié)點,節(jié)點測試 * 都為真。例如,child::* 將選擇上下文的所有的元素孩孩子,而 attribute::* 將選擇上下文節(jié)點的所有的屬性。

    節(jié)點測試可以用格式 NCName:*。在這種情況下,前綴就以與 QName 一樣的方法被擴展,即使用上下文命名空間聲明。在表達式上下文的前綴如果沒有命名空間聲明,則是一個錯誤。不論名字的局域部分,對於基本類型的任何節(jié)點,如果其擴展名有命名空間 URI 將其前綴擴展,節(jié)點測試永為真。

    對於任何正文節(jié)點,節(jié)點測試 text() 為真。例如,child::text() 將選擇上下文節(jié)點的正文節(jié)點孩子。同樣,對於注釋節(jié)點,節(jié)點測試 comment() 為真;對於處理指令,節(jié)點測試 processing-instruction() 為真; processing-instruction() 測試可以有一個字面量 Literal 的參數(shù),在這種情況下,對於所有的處理指令,如指令名與字面量值 Literal 相等,其值為真。

    對於任何節(jié)點,無論其類型,節(jié)點測試 node() 為真。

    [7]??? NodeTest ???::=??? NameTest
    | NodeType '(' ')'
    | 'processing-instruction' '(' Literal ')'

    2.4 判定詞

    一個軸不是前進軸就是倒轉(zhuǎn)軸。前進軸是依文本順序在任何時候都僅僅包含上下文節(jié)點或在上下文節(jié)點以后的節(jié)點的軸。倒轉(zhuǎn)軸是依文本順序在任何時候都僅僅包含上下文節(jié)點或在文檔順序在上下文節(jié)點前的節(jié)點的軸。因此,ancestorancestor-or-selfprecedingpreceding-sibling 軸是倒轉(zhuǎn)軸;所有的其余的軸都是前進軸。由於 self 軸總是至多包含一個節(jié)點,它是前進軸或是倒轉(zhuǎn)軸都不造成任何差別。軸的節(jié)點集合的成員的[定義鄰近位置對前進軸是按文檔順序的節(jié)點集合是節(jié)點的位置,對倒轉(zhuǎn)軸是按文檔反序的節(jié)點集合是節(jié)點的位置。第一個的位置是1。]

    判定詞依照軸過濾節(jié)點集合來生成新的節(jié)點集合。對於被過濾的節(jié)點集合里的每節(jié)點,PredicateExpr 將該節(jié)點作為上下文節(jié)點來求值,以節(jié)點集合的節(jié)點數(shù)為上下文大小,以依照在節(jié)點集合中節(jié)點的鄰近位置為上下文位置,如果對節(jié)點 PredicateExpr 的求值為真,新的節(jié)點集合就包括該節(jié)點;否則就不包括。

    PredicateExpr 求值是通過先求 Expr 的值并把結(jié)果轉(zhuǎn)換成布爾值而來的。如果結(jié)果是一數(shù)字且該數(shù)字與上下文位置相等,結(jié)果將被轉(zhuǎn)變?yōu)檎妫环駝t為假。如果結(jié)果不是一個數(shù)字,然后結(jié)果將被變換成好像調(diào)用過函數(shù) boolean 后的結(jié)果。這樣地址路徑 para[3] 等價 para[position()=3]

    判定詞(Predicates)
    [8]??? Predicate ???::=??? '[' PredicateExpr ']'
    [9]??? PredicateExpr ???::=??? Expr

    2.5 縮簡句法

    這是一些使用縮簡句法的地址路徑例子:

    • para 選擇上下文節(jié)點的 para 元素孩子

    • * 選擇上下文節(jié)點的所有的元素孩子

    • text() 選擇上下文節(jié)點的所有的正文節(jié)點孩子

    • @name 選擇上下文節(jié)點的 name 屬性

    • @* 選擇上下文節(jié)點的所有的屬性

    • para[1] 選擇上下文節(jié)點的第一個 para 孩子

    • para[last()] 選擇上下文節(jié)點的最后一個 para 孩子

    • */para 選擇上下文節(jié)點的所有的 para 孫子

    • /doc/chapter[5]/section[2] 選擇doc的第五個 chapter 的第二個 section

    • chapter//para 選擇上下文節(jié)點的 chapter 元素孩子的所有 para 元素子孫

    • //para 選擇文檔根的所有的 para 子孫,也就是選擇上下文節(jié)點所在的文檔中所有的 para 元素

    • //olist/item 選擇上下文節(jié)點所在的文檔中所有的以 olist 為父的 item 元素

    • . 選擇上下文節(jié)點

    • .//para 選擇上下文節(jié)點的 para 元素子孫

    • .. 選擇上下文節(jié)點的父

    • ../@lang 選擇上下文節(jié)點的父的 lang 屬性

    • para[@type="warning"] 選擇的上下文節(jié)點的所有的有屬性 type 且值為 warningpara 孩子

    • para[@type="warning"][5] 選擇的上下文節(jié)點的所有的有屬性 type 且值為 warningpara 孩子中的第五個

    • para[5][@type="warning"] 選擇的上下文節(jié)點的第五個 para 孩子如果該節(jié)點有屬性 type 且值為 warning 的話

    • chapter[title="Introduction"] 選擇上下文節(jié)點的 chapter 孩子如果它有一個或多個 title 孩子且字串值Introduction

    • chpater[title] 選擇的上下文節(jié)點中有一個或一個以上 title 孩子的 chpater 孩子

    • employee[@secretary and @assistant] 選擇上下文節(jié)點的所有既有 secretary 屬性又有 assistant 屬性的 employee 孩子

    最重要的縮寫是 child:: 能從地點步進省略掉。實際效果上,child 是缺省軸。例如,地址路徑 div/parachild::div/child::para 的縮寫。

    屬性也有縮寫形式: attribute:: 能被縮寫成 @。例如,地址路徑 para[@type="warning"]child::para[attribute::type="warning"] 的縮寫,也就是選擇有 type 屬性且屬性值為 warningpara 孩子。

    ///descendant-or-self::node()/ 的縮寫。例如,//para/descendant-or-self::node()/child::para 的縮寫,因此選擇文檔中所有的 para 元素(即使 para 元素是文檔元素,也會被 //para 所選擇,因為文檔元素是根節(jié)點的孩子); div//paradiv/descendant-or-self::node()/child::para 的縮寫,因此將選擇 div 孩子的所有 para 子孫。

    注意:

    地址路徑 //para[1] 與地址路徑 /descendant::para[1] 的含意不一樣,后者選擇第一個 para 元素子孫,前者選擇是他們的父的第一 para 孩子的所有的子孫 para 元素。

    地點路進 .self::node() 的縮寫。這與 // 一起使用特別有用。例如,地址路徑 .//paraself::node()/descendant-or-self::node()/child::para 的縮寫,因此將選擇上下文節(jié)點的所有的 para 子孫元素。

    同樣,地址路徑 ..parent::node() 的縮寫。例如,../titleparent::node()/child::title 的縮寫因此這將選擇上下文節(jié)點的父的 title 孩子。

    縮寫
    [10]??? AbbreviatedAbsoluteLocationPath ???::=??? '//' RelativeLocationPath
    [11]??? AbbreviatedRelativeLocationPath ???::=??? RelativeLocationPath '//' Step
    [12]??? AbbreviatedStep ???::=??? '.'
    | '..'
    [13]??? AbbreviatedAxisSpecifier ???::=??? '@'?

    3 表達式

    3.1 基礎(chǔ)

    VariableReference 求值成變量名是綁定到在上下文中變量綁定的集合。如果變量名沒有與在上下文中變量綁定的集合中的變量綁定在一起,則是一個錯誤。

    括號可以用于分組。

    [14]??? Expr ???::=??? OrExpr
    [15]??? PrimaryExpr ???::=??? VariableReference
    | '(' Expr ')'
    | Literal
    | Number
    | FunctionCall

    3.2 函數(shù)調(diào)用

    函數(shù)調(diào)用 FunctionCall 表達式的求值是通過使用函數(shù)名 FunctionName 在表達式求值上下文函數(shù)庫中確相應(yīng)的函數(shù),求各個參數(shù) Argument 的值,將每個參數(shù)轉(zhuǎn)換成該函數(shù)所需的類型,最后,調(diào)用函數(shù),并傳遞轉(zhuǎn)換后的參數(shù)。如果參數(shù)的數(shù)目不對的或參數(shù)不能被變換到要求的類型,則是一個錯誤。

    表達式 FunctionCall 的結(jié)果是由函數(shù)返回的結(jié)果。

    參數(shù)被變換成字符串類型時,仿佛調(diào)用了字符串函數(shù) string;參數(shù)被變換成數(shù)字類型時,好像調(diào)用了數(shù)字函數(shù) number;參數(shù)被變換成布爾的類型時,好像調(diào)用了布爾函數(shù) boolean。不是類型節(jié)點集合 node-set 的參數(shù)不能被變換成節(jié)點集合 node-set。

    [16]??? FunctionCall ???::=??? FunctionName '(' ( Argument ( ',' Argument )* )? ')'
    [17]??? Argument ???::=??? Expr

    3.3 節(jié)點集合

    地址路徑能作為表達式使用。表達式返回路徑所選擇的節(jié)點的集合。

    | 操作符計算它的操作數(shù)的并集,該并集必須是節(jié)點集合。

    判定詞 用過濾地址路徑的同樣的方法來過濾表達式。如果被過濾的表達式求值不到節(jié)點集合,則是一個錯誤。判定詞依賴于孩子軸來過濾節(jié)點集合。

    注意:

    判定詞的意思關(guān)鍵地取決于應(yīng)用于哪個軸。例如,preceding::foo[1] 返回在顛倒文檔順序下第一個 foo 元素,因為應(yīng)用于判定詞 [1] 的軸是 preceding 軸;與此相反,(preceding::foo)[1]文件順序下返回第一個 foo,因為應(yīng)用于判定詞 [1] 的軸是孩子軸。

    /// 操作符組成表達式及相對點路徑。如果表達式求值不到節(jié)點集合,則是一個錯誤。/ 操作符以在地址路徑中用 / 的同樣方式來組成。如在地址路徑中,///descendant-or-self::node()/ 的簡縮。

    沒有對象的類型能被變換成節(jié)點集合。

    [18]??? UnionExpr ???::=??? PathExpr
    | UnionExpr '|' PathExpr
    [19]??? PathExpr ???::=??? LocationPath
    | FilterExpr
    | FilterExpr '/' RelativeLocationPath
    | FilterExpr '//' RelativeLocationPath
    [20]??? FilterExpr ???::=??? PrimaryExpr
    | FilterExpr判定詞

    3.4 布爾

    布爾類型的對象能有兩個值之一:真和假。

    or 表達式的求值是對每個操作數(shù)求值,并且,把它的值變換到布爾值,好像調(diào)用了布爾函數(shù) boolean。如果值為真,其結(jié)果為真,否則,為假。如果左邊的操作數(shù)求值為真,右邊的操作數(shù)將不再沒被求值。

    and 表達式的求值是對每個操作數(shù)求值,并且,把它的值變換到布爾值,好像調(diào)用了布爾函數(shù) boolean。如果值為真,其結(jié)果為真,否則,為假。如果左邊的操作數(shù)求值為假,右邊的操作數(shù)將不再沒被求值。

    EqualityExpr (不只是 RelationalExpr)或 RelationalExpr(不只是AdditiveExpr)是通過比較來自于對兩個操作數(shù)結(jié)果的對象來求值的。以下三段話定義了結(jié)果對象的比較。一、涉及到節(jié)點集合的比較被定義按照不涉及到節(jié)點集合的比較,對 =!=<=<>=>一律如此。二、沒有涉及到節(jié)點集合的比較被定義成 =!=。三、沒有涉及到節(jié)點集合的比較被定義成 <=<>=>

    如果被比較的兩個對象是節(jié)點集合,那么,其比較結(jié)果為真當且僅當在兩個節(jié)點集合中各有一個節(jié)點,并且,比較這兩個節(jié)點的字串值的結(jié)果為真。如果被比較的一個對象是節(jié)點集合而另一個是數(shù)字,其比較結(jié)果為真當且僅當在節(jié)點集合中有一節(jié)點,并且,比較用函數(shù) number 將該節(jié)點轉(zhuǎn)換成的字串值的數(shù)字與被比較的數(shù)字為真。如果被比較的一個對象是節(jié)點集合而另一個是字符串,其比較結(jié)果為真當且僅當在節(jié)點集合中有一節(jié)點,并且,比較節(jié)點的字串值與另一個的字符串為真。如果被比較的一個對象是節(jié)點集合而另一個是布爾類型,其比較結(jié)果為真當且僅當在節(jié)點集合中有一節(jié)點,并且,比較用函數(shù) boolean 將該節(jié)點轉(zhuǎn)換成的布爾類型與被比較的布爾類型為真。

    當兩個被比較的對象都不是節(jié)點集合,而且,操作符為 =!=,那么,比較這類對象時,按以下方式將它們轉(zhuǎn)換成常見類型然后再比較。如果被比較的對象中至少有一個是布爾類型,那么,每一個被比較的對象都要轉(zhuǎn)換成布爾類型,正如調(diào)用了boolean 函數(shù)。不然的話,如果至少有一個是數(shù)字,那么,每一個被比較的對象都要轉(zhuǎn)換成數(shù)字,正如調(diào)用了number 函數(shù)。再不然的話,兩個對象都轉(zhuǎn)換成字符串正如調(diào)用了string 函數(shù)。 = 的比較為真,當且僅當在對象是相等的;!= 的比較為真,當且僅當在對象是不相等的。數(shù)字相等的比較依照 IEEE 754 [IEEE 754]。兩個布爾類型相等,當且僅當它們都為真或都為假。兩個字符串相等,當且僅當它們都由同樣序列的 UCS 字符組成。

    注意:

    如果 $x 綁定于一節(jié)點集合,那么,$x="foo"not($x!="foo") 的含義不同:前者為真,當且僅當在 $x有些節(jié)點有字串值為 foo ;后者前者為真,當且僅當在 $x所有節(jié)點有字串值為 foo

    當兩個被比較的對象都不是節(jié)點集合,而且,操作符為 =!=,那么,比較這類對象時,按以下方式將它們轉(zhuǎn)換成常見類型然后再比較。如果被比較的對象中至少有一個是布爾類型,那么,每一個被比較的對象都要轉(zhuǎn)換成布爾類型,正如調(diào)用了boolean 函數(shù)。不然的話,如果至少有一個是數(shù)字,那么,每一個被比較的對象都要轉(zhuǎn)換成數(shù)字,正如調(diào)用了number 函數(shù)。再不然的話,兩個對象都轉(zhuǎn)換成字符串正如調(diào)用了string 函數(shù)。 = 的比較為真,當且僅當在對象是相等的;!= 的比較為真,當且僅當在對象是不相等的。數(shù)字相等的比較依照 IEEE 754 [IEEE 754]。兩個布爾類型相等,當且僅當它們都為真或都為假。兩個字符串相等,當且僅當它們都由同樣序列的 UCS 字符組成。

    注意:

    如果 $x 綁定于一節(jié)點集合,那么,$x="foo"not($x!="foo") 的含義不同:前者為真,當且僅當在 $x有些節(jié)點有字串值為 foo ;后者前者為真,當且僅當在 $x所有節(jié)點有字串值為 foo

    當兩個被比較的對象都不是節(jié)點集合,而且,操作符為 <=<>=>,那么,要比較的對象都轉(zhuǎn)換成數(shù)字并依照 IEEE 754 進行比較。< 的比較為真,當且僅當?shù)谝粋€數(shù)小於第二個數(shù)。 > 的比較為真,當且僅當?shù)谝粋€數(shù)大於第二個數(shù)。 >= 的比較為真,當且僅當?shù)谝粋€數(shù)大於或等於第二個數(shù)

    注意:

    當 XPath 表達式出現(xiàn)在 XML 文檔, 所有的 <<= 操作符必須按照 XML 1.0 的規(guī)則加上引號,例如,&lt;&lt;=。在下列例子中,test 屬性的值是個 XPath 表達式:

    <xsl:if test="@value &lt; 10">...</xsl:if>
    [21]??? OrExpr ???::=??? AndExpr
    | OrExpr 'or' AndExpr
    [22]??? AndExpr ???::=??? EqualityExpr
    | AndExpr 'and' EqualityExpr
    [23]??? EqualityExpr ???::=??? RelationalExpr
    | EqualityExpr '=' RelationalExpr
    | EqualityExpr '!=' RelationalExpr
    [24]??? RelationalExpr ???::=??? AdditiveExpr
    | RelationalExpr '<' AdditiveExpr
    | RelationalExpr '>' AdditiveExpr
    | RelationalExpr '<=' AdditiveExpr
    | RelationalExpr '>=' AdditiveExpr

    注意:

    以上語法的結(jié)果是如下順序的優(yōu)先級(最低優(yōu)先級先列出):

    • or

    • and

    • = , !=

    • <= , < , >= , >

    并且操作符都從左結(jié)合律。

    例如,3 > 2 > 1(3 > 2) > 1 等價,其求值結(jié)果為假。

    3.5 數(shù)字

    數(shù)字代表的是浮點數(shù)。數(shù)字可以有任何 64 位雙精度格式的 IEEE 754 值[IEEE 754]。這些包括特殊的 “非數(shù)字”(NaN)值,正負無窮大,和正負零。參看標準[JLS]的4.2.3 節(jié)關(guān)鍵規(guī)則的概要。

    數(shù)字操作符將操作數(shù)轉(zhuǎn)換成數(shù)字,仿佛調(diào)用了函數(shù)number

    操作符 + 執(zhí)行加法。

    操作符 - 執(zhí)行減法。

    注意:

    由於 XML 允許 - 出現(xiàn)在名字中,典型地需要有空白符在 - 操作符之前。例如,foo-bar 求值結(jié)果為一個包含名為 foo-bar 的孩子的節(jié)點集合;foo - bar 求值結(jié)果是把第一個子元素 foo字串值轉(zhuǎn)換成數(shù)字的結(jié)果和把第一個bar 孩子的 字串值轉(zhuǎn)換成數(shù)字的結(jié)果的差。

    div 操作符按照 IEEE 754 執(zhí)行浮點數(shù)的除法。

    mod 操作符返回去尾除法的余。例如:

    • 5 mod 2 返回 1

    • 5 mod -2 返回 1

    • -5 mod 2 返回 -1

    • -5 mod -2 返回 -1

    注意:

    這與 Java 和ECMAScript 中的 % 操作符一樣。

    注意:

    這與 IEEE 754 中返回取整 除的余操作不一樣。

    數(shù)字表達式
    [25]??? AdditiveExpr ???::=??? MultiplicativeExpr
    | AdditiveExpr '+' MultiplicativeExpr
    | AdditiveExpr '-' MultiplicativeExpr
    [26]??? MultiplicativeExpr ???::=??? UnaryExpr
    | MultiplicativeExprMultiplyOperatorUnaryExpr
    | MultiplicativeExpr 'div' UnaryExpr
    | MultiplicativeExpr 'mod' UnaryExpr
    [27]??? UnaryExpr ???::=??? UnionExpr
    | '-' UnaryExpr

    3.6 字符串

    字符串由一個有零或多個在 XML 建議書[XML]定義的字符的序列組成。因此,在 XPath 中一個單字符對應(yīng)于一單個有相應(yīng) Unicode 數(shù)值的 Unicode 抽象字符(參看[Unicode]);這與 16-位的 Unicode 編碼值不是同一件事:Unicode 編碼字符代表 Unicode 數(shù)值大於 U+FFFF 的抽象字符是一對 16-位 Unicode 編碼值 (替代對surrogate pair)。在許多的編程語言,字符串由一序列 Unicode 編碼值來表示;在這樣的語言中 XPath 的實現(xiàn)必須考慮確保替代對被正確地處理成一個單一的 XPath 字符。

    注意:

    在 Unicode 可能會出現(xiàn)兩個字符串被當作同樣的, 即使它們由不同的Unicode 抽象字符序列組成。例如,有些重音字符可以由預制的或分解的形式來表示。因此,XPath 可能會返回預想不到的結(jié)果,除非這些在 XPath 表達式及 XML 文檔的字符被規(guī)范化成規(guī)范的形式。參見[Character Model]。

    3.7 詞法結(jié)構(gòu)

    當進行分割(tokenizing)時, 總是返回最長的分割段(token)。

    盡管語法中沒有明確的允許,為了可讀性表達式可以使用空白符:ExprWhitespace 可以在所有 ExprToken 式樣(pattern)前后自由地添加。

    以下特別的分割規(guī)則的使用必須按照說明的順序來應(yīng)用以消除 ExprToken 的歧義:

    表達式的詞法結(jié)構(gòu)
    [28]??? ExprToken ???::=??? '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
    | NameTest
    | NodeType
    | Operator
    | FunctionName
    | AxisName
    | Literal
    | Number
    | VariableReference
    [29]??? Literal ???::=??? '"' [^"]* '"'
    | "'" [^']* "'"
    [30]??? Number ???::=??? Digits ('.' Digits?)?
    | '.' Digits
    [31]??? Digits ???::=??? [0-9]+
    [32]??? Operator ???::=??? OperatorName
    | MultiplyOperator
    | '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
    [33]??? OperatorName ???::=??? 'and' | 'or' | 'mod' | 'div'
    [34]??? MultiplyOperator ???::=??? '*'
    [35]??? FunctionName ???::=??? QName - NodeType
    [36]??? VariableReference ???::=??? '$' QName
    [37]??? NameTest ???::=??? '*'
    | NCName ':' '*'
    | QName
    [38]??? NodeType ???::=??? 'comment'
    | 'text'
    | 'processing-instruction'
    | 'node'
    [39]??? ExprWhitespace ???::=??? S

    4 核心函數(shù)庫

    本節(jié)描述用來求值表達式的函數(shù), XPath的實現(xiàn)必須總是在函數(shù)庫中包括這些函數(shù)。

    在函數(shù)庫中的每一個函數(shù)都使用一個函數(shù)原型,該原型給定返回類型,函數(shù)的名稱,以及參數(shù)的類型。如果參數(shù)類型后跟隨一個問號,那么參數(shù)是可選的;否則,參數(shù)則是必須有的。

    4.1 節(jié)點集合函數(shù)

    number last()

    last 函數(shù)返回一個數(shù)字,該數(shù)字等於從表達式求值上下文中的上下文大小

    number position()

    position函數(shù)返回一個數(shù)字,該數(shù)字等於從表達式求值上下文中的上下文位置

    number count(node-set)

    count 函數(shù)返回在參數(shù)node-set中節(jié)點的個數(shù)。

    node-set id(object)

    id 函數(shù)id通過元素的唯一的ID選擇他們(參見 5.2.1 唯一 ID)。當id的參數(shù)是節(jié)點集合類型時,結(jié)果是對在參數(shù)節(jié)點集合里的每一個節(jié)點的字串值應(yīng)用id的結(jié)果的聯(lián)合。當?shù)?code>id的參數(shù)是任何其它的類型時,參數(shù)被轉(zhuǎn)換成一個字符串,即如調(diào)用了string 函數(shù)一樣;字符串被分割成由空白格分開的單字片序列(空白格是與產(chǎn)生式 S匹配的字符的任何順序);結(jié)果是在上下文節(jié)所在的同一文檔中那些具有唯一id等於序列中任何一個單字片的元素的節(jié)點集合。

    • id("foo") 選擇唯一ID為 foo 元素

    • id("foo")/child::para[position()=5] 選擇唯一帶有 ID 為 foo 的元素的第5個 para 孩子

    string local-name(node-set?)

    函數(shù) local-name 返回一個節(jié)點的擴展名的局域部分,該節(jié)點為依照文檔順序參數(shù)節(jié)點集合里的第一個節(jié)點。如果參數(shù)節(jié)點集合是空或第一節(jié)點沒有擴展名,則返回一個空字符串。如果參數(shù)被省略,它則缺省為僅有一個上下文節(jié)點成員的節(jié)點集合。

    string namespace-uri(node-set?)

    函數(shù) namespace-uri 返回依照文檔順序參數(shù)節(jié)點集合中的第一個節(jié)點的擴展名的命名空間 URI。如果參數(shù)節(jié)點集合是空的,第一節(jié)點沒有擴展名,或擴展名的命名空間 URI 為空,則返回一個空字符串。如果參數(shù)被省略,它則缺省為僅有一個上下文節(jié)點成員的節(jié)點集合。

    注意:

    除了元素節(jié)點和屬性節(jié)點外函數(shù) namespace-uri 返回的字符串將為空。

    string name(node-set?)

    函數(shù) name 返回一個字符串,字符串包含一個QName,它代表依照文檔順序參數(shù)節(jié)點集合中的第一個節(jié)點的擴展名QName代表擴展名字時,必須注意到命名空間聲明實際上是對被表示的擴展名的節(jié)點的。典型地,在XML資源中將是 QName 出現(xiàn)。如果命名空間聲明實際上是對與有同樣命名空間的多重的前綴相聯(lián)系的節(jié)點,這不必是實際上的情況。然而,實現(xiàn)可以包括有關(guān)節(jié)點的表示的原來前綴的信息;在這樣的情況下,實現(xiàn)能保證返回的字符串總是與在 XML 文檔使用的QName一樣。如果參數(shù)節(jié)點集合是空的或第一節(jié)點沒有擴展名,返回一個空的字符串。如果它省略了的參數(shù),則缺省為僅有上下文節(jié)點一個成員的節(jié)點集合。

    注意:

    除了元素節(jié)點和屬性節(jié)點外,由 name 函數(shù)返回的字符串將與 local-name 函數(shù)返回的字符串一樣。

    4.2 字符串函數(shù)

    string string(object?)

    string 函數(shù)將對象依下列各項轉(zhuǎn)換成字符:

    • 節(jié)點集合通過返回在節(jié)點集合中文檔順序下第一個節(jié)點的字串值來轉(zhuǎn)換成字符串。如果節(jié)點是空的則返回空字符串。

    • 數(shù)字按以下方式轉(zhuǎn)換成字符

      • NaN 轉(zhuǎn)換成字符串 NaN

      • 正零轉(zhuǎn)換成字符串 0

      • 負零轉(zhuǎn)換成字符串 0

      • 正無窮大轉(zhuǎn)換成字符串 Infinity

      • 負無窮大轉(zhuǎn)換成字符串 -Infinity

      • 如果數(shù)字是整數(shù),該數(shù)字表示成一個與無小數(shù)點及領(lǐng)頭零的 Number一樣的十進制的形式,如果數(shù)字是負數(shù),則在其前加一個負號(-)。

      • 否則,該數(shù)字表示成一個與包括小數(shù)點及至少在小數(shù)點前面有一數(shù)字并且小數(shù)點后有一數(shù)字的 Number一樣的十進制的形式,如果數(shù)字是負數(shù),則在其前加一個負號(-);除了在小數(shù)點前要求直接要有一個位的零外,不應(yīng)該有領(lǐng)頭的零;在小數(shù)點后除了要求的一位數(shù)外,應(yīng)有不多不少的位來區(qū)分該數(shù)與所有其它的 IEEE 754 數(shù)值。

    • 布爾的假值轉(zhuǎn)換成字符串 false。布爾的真值轉(zhuǎn)換成字符串 true

    • 不是四種基本類型的對象依照所屬類型的方式轉(zhuǎn)換成字符串。

    如果參數(shù)省略,則缺省為僅有一個上下文節(jié)點為成員的節(jié)點集合。

    注意:

    string 函數(shù)不是要用來將數(shù)字轉(zhuǎn)換成字符串呈現(xiàn)給用戶的。 format-number 函數(shù)和[XSLT] 中的 xsl:number 元素提供了這樣的功能。

    string concat(string, string, string*)

    concat 函數(shù)返回它的參數(shù)的聯(lián)結(jié)。

    boolean starts-with(string, string)

    如果第一個字符串參數(shù)以第二個字符串參數(shù)起頭,starts-with 函數(shù)返回真,否則,返回假。

    boolean contains(string, string)

    如果第一個字符串參數(shù)包含第二個字符串參數(shù),contains 函數(shù)返回真,否則,返回假。

    string substring-before(string, string)

    substring-before 函數(shù)返回第一個字符串參數(shù)在第二個參數(shù)首次出現(xiàn)之前的子字符串,或者,如果第一個字符串參數(shù)不包含第二個字符串參數(shù)則返回空字符串。例如,substring-before("1999/04/01","/") 返回 1999

    string substring-after(string, string)

    substring-after 函數(shù)返回第一個字符串參數(shù)在第二個參數(shù)首次出現(xiàn)之后的子字符串,或者,如果第一個字符串參數(shù)不包含第二個字符串參數(shù)則返回空字符串。例如, substring-after("1999/04/01","/") 返回 04/01,而 substring-after("1999/04/01","19") 返回 99/04/01

    string substring( string , number , number? )

    substring 函數(shù)返回第一個字符串參數(shù)從第二個參數(shù)所指定的位置開始,以第三個參數(shù)為長度的子字符串。例如, substring("12345",2,3) 返回 "234"。如果沒有第三個參數(shù),則返回從第二個參數(shù)所指定的位置開始直到結(jié)束。例如, substring("12345",2) 返回"2345"

    更確切地說,每一個字符串里的字符(參看3.6 字符串)是被看作有一個數(shù)字位置:第一個字符是 1 ,第二個字符是 2 ,依此類推。

    注意:

    這與 Java 和 ECMAScript 不同,在 Java 和 ECMAScript 中 String.substring 方法將第一個字符的位置當成 0 。

    該返回的子字符串包含那些字符位置大於或等於第二參數(shù)的取整值,如果指定了第三個參數(shù),則小於第二和第三個參數(shù)的取整值之和;以上的比較和加法遵循 IEEE 754 的規(guī)則;取整操作仿佛是調(diào)用了round 函數(shù)。以下的例子說明了各種不常見的案例:

    • substring("12345", 1.5, 2.6) 返回 "234"

    • substring("12345", 0, 3) 返回 "12"

    • substring("12345", 0 div 0, 3) 返回 ""

    • substring("12345", 1, 0 div 0) 返回 ""

    • substring("12345", -42, 1 div 0) 返回 "12345"

    • substring("12345", -1 div 0, 1 div 0) 返回 ""

    number string-length( string? )

    string-length 返回字符串(參看 3.6 字符串)中字符的個數(shù)。如果參數(shù)省略,則缺省為一個上下文節(jié)點再轉(zhuǎn)換成字符串,也就是上下文節(jié)點的 字串值

    string normalize-space(string?)

    normalize-space 函數(shù)返回空白符規(guī)范化 后的參數(shù)字符串,該規(guī)范化是清除領(lǐng)頭及結(jié)尾的空白字以及用一個空白符替換連續(xù)的空白符。空白符字符與 XML 中的產(chǎn)生式 S 所允許的是一樣的。如果參數(shù)省略,則缺省為一個上下文節(jié)點再轉(zhuǎn)換成字符串,也就是上下文節(jié)點的 字串值

    string translate(string, string, string)

    translate 函數(shù)返回第一個參數(shù)的字符串,其中有在第二個參數(shù)中出現(xiàn)的字符都被在第三個參數(shù)中相對應(yīng)位置的字符所替換。例如,translate("bar","abc","ABC") 返回字符串 BAr。如果,第二個參數(shù)里的字符在第三個參數(shù)的相對應(yīng)位置沒有字符(因為第二個參數(shù)里的字符串比第三個參數(shù)的字符串長),那么,第一個參數(shù)里的那個字符將被移去。例如,translate("--aaa--","abc-","ABC") 返回 "AAA"。如果在第二個參數(shù)里的字符出現(xiàn)超過一次,那么,第一次的出現(xiàn)決定替換的字符。如果第三個參數(shù)里的字符串比第二個參數(shù)的字符串長, 那么,多余的字符將被忽略。

    注意:

    translate 函數(shù)不是一個對所有語言大小寫轉(zhuǎn)換的完整解決方案。XPath 的將來的版本可能會為大小寫轉(zhuǎn)換提供額外的函數(shù)。

    4.3 布爾函數(shù)

    boolean boolean(object)

    boolean 函數(shù)依下列各項轉(zhuǎn)換其參數(shù):

    • 數(shù)字為真當且僅當它不是正負零或 NaN

    • 節(jié)點集合為真當且僅當它不為空

    • 字符串為真當且僅當它的長度不為零

    • 不是四種基本類型的對象依照所屬類型的方式轉(zhuǎn)換成布爾類型。

    boolean not(boolean)

    如果參數(shù)為真 not 函數(shù)返回真,否則返回假。

    boolean true()

    true 函數(shù)返回真。

    boolean false()

    The false 函數(shù)返回假。

    boolean lang(string)

    依賴于 xml:lang 屬性指定的上下文節(jié)點的語言與參數(shù)指定的語言的子語言是否一致或一樣,參數(shù)字符串lang函數(shù)返回真或假。上下文節(jié)點的語言由上下文節(jié)點的 xml:lang 屬性決定,或者,如果沒有 xml:lang 屬性則由最接近的有 xml:lang 屬性祖先節(jié)點的 xml:lang 屬性值決定。如果沒有這樣的節(jié)點,那么 lang 返回假。如果有這樣的節(jié)點,那么在不考慮大小的情況下,當屬性值寫與參數(shù)相等或有以- 開始的后綴且其值等於參數(shù)忽略后綴的值,lang 返回真。如果上下文節(jié)點為以下五個元素中的任何一個,lang("en") 為真:

    <para xml:lang="en"/>
    <div xml:lang="en"><para/></div>
    <para xml:lang="EN"/>
    <para xml:lang="en-us"/>

    4.4 數(shù)字函數(shù)

    number number(object?)

    number 函數(shù)參數(shù)依下列各項轉(zhuǎn)換成數(shù)字:

    • 可選的空白符跟隨可選的減號再跟隨 Number 再跟隨空白符的字符串轉(zhuǎn)換成 IEEE 754 最接近的 (根據(jù) IEEE 754 就近取整規(guī)則) 由字符串表示的數(shù)學值的數(shù)字;其它任何的字符串轉(zhuǎn)換成 NaN

    • 布爾真轉(zhuǎn)換成 1 ;布爾假轉(zhuǎn)換成 0

    • 節(jié)點集合首先轉(zhuǎn)換成字符串好像調(diào)用了 string 函數(shù),然后再按字符串參數(shù)的方式轉(zhuǎn)換

    • 不是四種基本類型的對象依照所屬類型的方式轉(zhuǎn)換成數(shù)字。

    如果參數(shù)省略,則缺省為僅有一個上下文節(jié)點為成員的節(jié)點集合。

    注意:

    除非元素是在語言自然格式(典型地被改變成語言特定的格式呈現(xiàn)給用戶)下代表數(shù)字數(shù)據(jù)的類型,number 函數(shù)不應(yīng)用于 XML 文檔元素中的數(shù)字轉(zhuǎn)換。另外,除非語言自然格式與 XPath 句法的 Numbernumber 函數(shù)不能使用。

    number sum(node-set)

    對於在參數(shù)節(jié)點集合的每個節(jié)點,sum 函數(shù)返回節(jié)點字串值轉(zhuǎn)換成數(shù)字后的和。

    number floor(number)

    floor 函數(shù)返回不大於參數(shù)的整數(shù)的最大數(shù) (最接近于正無窮大) 。

    number ceiling(number)

    ceiling 函數(shù)返回不小於參數(shù)的整數(shù)的最小數(shù) (最接近于負無窮大) 。

    number round(number)

    round 函數(shù)返回最接近于參數(shù)的整數(shù)。如果有兩個這樣的數(shù)字,那么,返回最接近于正無窮大的那個。如果參數(shù)是 NaN,那么返回 NaN。如果參數(shù)是正無窮大,那么返回正無窮大。如果參數(shù)是負無窮大,那么返回負無窮大。如果參數(shù)是正零,那么返回正零。如果參數(shù)是負零,那么返回負零。如果參數(shù)小於零,但大於或等於 -0.5 ,那么返回負零。

    注意:

    對於最后兩種情況,調(diào)用round 函數(shù)與加上 0.5 后并調(diào)用 floor的結(jié)果不同。

    5 數(shù)據(jù)模型

    XPath 將一個 XML 文檔作為一棵樹進行操作。本節(jié)描述 XPath 怎樣將一個 XML 文檔建成一棵樹的模型。該模型僅僅是概念上的并且不要求任何特定實現(xiàn)。在B XML 信息集映射中描述了該模型與 XML 信息集[XML Infoset

    被 XPath 操作的 XML 文檔必須遵循XML 命名空間建議書[XML Names]。

    樹包含節(jié)點,共有7種節(jié)點類型:

    • 根節(jié)點

    • 元素節(jié)點

    • 正文節(jié)點

    • 屬性節(jié)點

    • 命名空間節(jié)點

    • 處理指令節(jié)點

    • 注釋節(jié)點

    定義:對於每種節(jié)點類型,都有一個方法來決定該類型的節(jié)點的字串值。對一些節(jié)點,字串值是節(jié)點的一部分;對於其它節(jié)點,字串值的計算是由子孫節(jié)點的字串值來求出。]

    注意:

    對於元素節(jié)點和根節(jié)點,節(jié)點的字串值不與 DOM 的 nodeValue 方法返回了的字符串一樣(參看[DOM])。

    定義:一些節(jié)點的類型也有擴展名,它是由局域部分和命名空間 URI 對組成。局域部分是一個字符串。命名空間 URI 或為空或為一字符串。在 XML 文檔中說明的命名空間 URI 可以是一個在[RFC2396]中定義的 URI 引用;這意味著它能有一個片段標識符并可以是相對的。在處理的命名空間時,一個相對的 URI 應(yīng)該被轉(zhuǎn)換成絕對的 URI:在數(shù)據(jù)模型中節(jié)點擴展名的命名空間 URIs 應(yīng)該是絕對的。]如果兩個擴展名有一樣的局域部分,且都或有一空的命名空間 URI 或都有是相等的非空的命名空間 URI ,那么它們是相等的。

    定義文檔順序是對文檔中所有的節(jié)點定義的一個順序, 該順序?qū)?yīng)于在一般的實體的擴展以后,每個節(jié)點的 XML 表示的首字符出現(xiàn)在文檔 XML 表示中的順序。這樣,根節(jié)點將是第一個節(jié)點。元素節(jié)點出現(xiàn)在他們的孩子前面。因此,文檔順序制定了元素節(jié)點以在 XML (實體擴展后)中開始標簽出現(xiàn)的順序為順序。元素的屬性節(jié)點和命名空間節(jié)點出現(xiàn)在元素的孩子們前面。命名空間節(jié)點定義出現(xiàn)在屬性節(jié)點前。命名空間節(jié)點的相對順序是依賴于實現(xiàn)。屬性節(jié)點的相對的順序是實現(xiàn)依賴的。] [定義文檔倒順文檔順序的顛倒。]

    根節(jié)點和元素節(jié)點有子節(jié)點的有序表。節(jié)點從來不共享孩子:如果一節(jié)點與另一節(jié)點不是同樣的節(jié)點,那么,沒有一個節(jié)點的孩子與另一節(jié)點的任何一個孩子會是同一節(jié)點。[定義:除根節(jié)點以外,每個節(jié)點嚴格地只有一個],它是一元素節(jié)點或根節(jié)點。根節(jié)點或元素節(jié)點是每一個它的孩子節(jié)點的父。[定義:節(jié)點的子孫是該節(jié)點的孩子們和節(jié)點的孩子們的子孫。]

    5.1 根節(jié)點

    根節(jié)點為樹的根。除了作為樹的根,根節(jié)點并不出現(xiàn)。文檔元素的元素節(jié)點是根節(jié)點的孩子。出現(xiàn)在序言中和文檔元素后的處理指令及注釋也為根節(jié)點的子處理指令及注釋節(jié)點。

    根節(jié)點的字串值 是根節(jié)點在文本順序下所有文字節(jié)點子孫字串值的累加。

    根節(jié)點沒有擴展名

    5.2 元素節(jié)點

    在文檔中的每個元素都有一個元素節(jié)點。元素節(jié)點有擴展名, 該擴展名的確定是通過擴展按照 XML 命名空間建議書[XML Names]在標記中指定元素的QName。 如果QName沒有前綴并且無可應(yīng)用的缺省的命名空間,元素擴展名的命名空間 URI 為空。

    注意:

    依照[XML Names]附錄A.3中的注釋,擴展名的局部部分對應(yīng)于 ExpEType 元素的 type 屬性;擴展名的命名空間 URI 對應(yīng)于 ExpEType 元素的 ns 屬性,并且如果 ExpEType 元素的 ns 屬性被省略,擴展名的命名空間 URI 為空。

    元素節(jié)點的孩子是元素節(jié)點,注釋節(jié)點,處理節(jié)點及其內(nèi)容的文字節(jié)點。對內(nèi)部及外部實體的實體引用將被擴展,字符引用也被解決。

    元素節(jié)點的字串值是元素節(jié)點在文本順序下所有文字節(jié)點子孫字串值的累加。

    5.2.1 唯一 ID

    元素節(jié)點可以有 一個唯一標識符(ID),它是在DTD中聲明為類型 ID 的屬性的值。在同一文檔中,沒有兩個元素可以有相同的唯一標識符。如果 XML 處理器在同一文檔中發(fā)現(xiàn)兩個元素有相同的唯一標識符(如果該文檔是無效的,這樣的情形可能發(fā)生),那么,在文本順序下的第二個元素將被視為沒有唯一標識符。

    注意:

    如果一個文檔沒有DTD,那么,在該文檔中沒有元素將有唯一標識符。

    5.3 屬性節(jié)點

    每一個元素節(jié)點都有相關(guān)聯(lián)的屬性節(jié)點集;元素是每一個這些屬性節(jié)點的節(jié)點;然而,屬性節(jié)點不是它父元素的孩子。

    注意:

    這與 DOM 不同,DOM 不認為元素擁有屬性當做屬性的父 (參看[DOM])。

    元素從來不分享屬性節(jié)點:如果一節(jié)點與另一節(jié)點不是同樣的節(jié)點,那么,沒有一個元素節(jié)點的屬性節(jié)點會是另一節(jié)點的屬性節(jié)點。

    注意:

    操作符 = 測試兩個節(jié)點是否有一樣的值,不是他們是否是同一節(jié)點。這樣,兩個不同的元素的屬性可以使用 = 比較,盡管他們不是一樣的節(jié)點。

    對待缺省屬性與指定的屬性一樣。如果屬性申明在DTD中元素類型,而缺省申明為 #IMPLIED,并且,在元素中沒有給出該屬性,那么,元素的屬性集合不包含該屬性節(jié)點。

    一些屬性,如 xml:langxml:space,除非被其他的子孫元素中的相同屬性替換,從語義上它們應(yīng)用于所有有該屬性的元素的子孫元素。然而,這不影響屬性節(jié)點在樹里出現(xiàn)的位置:在元素的開始標簽或該元素的空元素標簽中明確地指定的,或在DTD中明確地聲明缺省值的那些屬性才是該元素擁有的屬性節(jié)點。

    屬性節(jié)點有擴展名字串值擴展名的確定是根據(jù) XML 命名空間建議書[XML Names],通過擴展 XML 文檔標簽中指定的QName而得到的。如果屬性的QName沒有前綴,屬性的名的命名空間 URI 將為空。

    注意:

    依照[XML Names]附錄A.3中的注釋,擴展名 expanded-name 的局部部分對應(yīng)于 ExpAName 元素的 name 屬性;擴展名 expanded-name 的命名空間 URI 對應(yīng)于 ExpEType 元素的 ns 屬性,并且,如果 ExpAName 元素的 ns 屬性被省略,擴展名的命名空間 URI 為空。

    屬性節(jié)點有字串值字串值是在 XML 建議書[XML]詳細說明的規(guī)范化的值。對其規(guī)范化值是零長度字符串的屬性無須分別處理:它以字串值是零長度字符串的屬性節(jié)點為結(jié)果。

    注意:

    也可能在外部的DTD或外部的參數(shù)實體中聲明缺省屬性。除非正在進行校驗,XML 建議書不要求 XML 處理器讀外部的DTD或外部的參數(shù)。樣式表或其它假設(shè) XPath 樹包含有在外部的DTD或外部的參數(shù)中申明缺省屬性值的功能軟件不能與一些無校驗 XML 處理器一起工作。

    沒有屬性節(jié)點與聲明命名空間的屬性相對應(yīng)(參看[XML Names])。

    5.4 命名空間節(jié)點

    每個元素都有命名空間節(jié)點的關(guān)聯(lián)的集合,一個為在元素的范圍的每個不同命名空間前綴(包括 xml 前綴,它由 XML 命名空間建議書[XML Names]隱式地聲明);而如果在對元素的范圍,另一個是為缺省命名空間。元素是這些命名空間節(jié)點的;然而,一個命名空間節(jié)點不是它的父元素的孩子。元素從來不分享命名空間節(jié)點:如果一個元素節(jié)點與另外的元素不是一樣的節(jié)點,那么,沒有一個元素節(jié)點的命名空間節(jié)點會是另一元素節(jié)點的命名空間節(jié)點。這意味著一個元素將有一個命名空間節(jié)點:

    • 對每個以 xmlns: 開始的元素的屬性;

    • 對每個以 xmlns: 開始的祖先元素的屬性,除非元素自己或一位更近的祖先重新聲明了該前綴;

    • xmlns 屬性,如果該元素或一些祖先有 xmlns, 并且,對最接近的這樣的元素 xmlns 屬性的值是非空的。

      注意:

      屬性 xmlns="" “未申明”缺省命名空間(參看[XML Names])。

    命名空間節(jié)點有擴展名:其局域部分是命名空間前綴(如果命名空間節(jié)點為缺省命名空間,則為空);命名空間 URI 總為空。

    命名空間節(jié)點的字串值是被綁定在命名空間前綴的命名空間 URI;如果它是相對的,它必須被解析,就象在擴展名中的命名空間 URI 擴展名字。

    5.5 處理指令節(jié)點

    除了在文檔類型聲明中出現(xiàn)的所有處理指令外,每個處理指令都有處理指令節(jié)點。

    每條處理指令都有擴展名: 其局域部分是處理指令的目標;其命名空間 URI 為空。處理指令節(jié)點的字串值是處理指令后跟隨的目標及任何空白的部分,不包括結(jié)尾的 ?>

    注意:

    XML 聲明不是一條處理指令,因此,沒有處理指令節(jié)點與 XML 聲明相對應(yīng)。

    5.6 注釋節(jié)點

    除了在文檔類型聲明中出現(xiàn)的所有注釋外,每條注釋都有注釋節(jié)點。

    注釋的字串值是注釋的內(nèi)容而不包括 起始的 <!-- 是或結(jié)尾的 -->

    注釋節(jié)點沒有擴展名

    5.7 正文節(jié)點

    字符數(shù)據(jù)組成正文節(jié)點。盡可能多的字符數(shù)據(jù)被組織進正文節(jié)點:從來沒有一個正文節(jié)點的后面或前面緊連的兄弟是個正文節(jié)點。正文節(jié)點的字串值是它的字符數(shù)據(jù)。正文節(jié)點總是至少有一個字符的數(shù)據(jù)。

    在 CDATA 節(jié)內(nèi)的每個字符都被當作字符數(shù)據(jù),這樣,在源文檔的 <![CDATA[<]]>&lt; 都看成是一樣的,都是在樹中正文節(jié)點的一個單字符 <。這樣,CDATA 節(jié)被看成好像把 <![CDATA[]]> 拿掉,而且,每次出現(xiàn)的 <& 都被分別地替換成 &lt;&amp;

    注意:

    當正文節(jié)點包含< 字符作為 XML 輸出,< 字符必須轉(zhuǎn)碼,例如使用 &lt;,或包含在 CDATA 節(jié)中。

    注釋、處理指令和屬性值中的字符不產(chǎn)生正文節(jié)點。外部實體中的行結(jié)束符都按 XML 建議書[XML]規(guī)范化成 #xA 。

    正文節(jié)點沒有擴展名

    6 一致性

    XPath的根本計劃是作為一個組件,為其它的規(guī)格書所使用。因此,XPath依賴于使用XPath的說明書(例如[XPointer]和[XSLT])來指定XPath的實現(xiàn)一致性標準,并且不為XPath的獨立的實現(xiàn)定義任何一致性標準。

    A 參考書目

    A.1 標準規(guī)范參考書目

    IEEE 754
    Institute of Electrical and Electronics Engineers. IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
    RFC2396
    T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. See http://www.ietf.org/rfc/rfc2396.txt.
    XML
    World Wide Web Consortium. Extensible Markup Language (XML) 1.0. W3C Recommendation. See http://www.w3.org/TR/1998/REC-xml-19980210
    XML Names
    World Wide Web Consortium. Namespaces in XML. W3C Recommendation. See http://www.w3.org/TR/REC-xml-names Also see: 中文翻譯 [簡體中文] .

    A.2 其他參考書目

    Character Model
    World Wide Web Consortium. Character Model for the World Wide Web. W3C Working Draft. See http://www.w3.org/TR/WD-charmod
    DOM
    World Wide Web Consortium. Document Object Model (DOM) Level 1 Specification. W3C Recommendation. See http://www.w3.org/TR/REC-DOM-Level-1
    JLS
    J. Gosling, B. Joy, and G. Steele. The Java Language Specification. See http://java.sun.com/docs/books/jls/index.html.
    ISO/IEC 10646
    ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. International Standard. See http://www.iso.ch/cate/d18741.html.
    TEI
    C.M. Sperberg-McQueen, L. Burnard Guidelines for Electronic Text Encoding and Interchange. See http://etext.virginia.edu/TEI.html.
    Unicode
    Unicode Consortium. The Unicode Standard. See http://www.unicode.org/unicode/standard/standard.html.
    XML Infoset
    World Wide Web Consortium. XML Information Set. W3C Working Draft. See http://www.w3.org/TR/xml-infoset
    XPointer
    World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft. See http://www.w3.org/TR/WD-xptr
    XQL
    J. Robie, J. Lapp, D. Schach. XML Query Language (XQL). See http://www.w3.org/TandS/QL/QL98/pp/xql.html
    XSLT
    World Wide Web Consortium. XSL Transformations (XSLT). W3C Recommendation. See http://www.w3.org/TR/xslt

    B XML 信息集映射(非標準)

    在 XPath 數(shù)據(jù)模型中的節(jié)點可按如下方式由 XML 信息集 [XML Infoset] 提供的信息項導出: [XML Infoset] as follows:

    注意:

    在XPath 本版本的準備完成的時候,即將替換五月17日版本的新版本的 XML 信息集工作草稿已接近完成,或?qū)⑴c本版的本規(guī)范同時發(fā)表或稍后發(fā)表。這里所給出的映射是按照新的 XML 信息集工作草稿。如果,XML 信息集工作草稿還沒有發(fā)表,W3C 成員可參考內(nèi)部的工作草稿版 http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html只有成員可訪問).

    • 根節(jié)點來自文檔的信息項。根節(jié)點的孩子來自 childrenchildren - comments 屬性。

    • 元素節(jié)點來自元素信息項。元素節(jié)點的孩子來自 childrenchildren - comments 屬性。元素節(jié)點的屬性來自 attributes 屬性。元素節(jié)點的命名空間來自 in-scope namespaces 屬性。元素節(jié)點擴展名的局域部分來自 local name 屬性。元素節(jié)點擴展名的命名空間 URI 來自 namespace URI 屬性。元素節(jié)點的唯一 ID 來自有 attribute type 屬性等於 IDattributes 屬性的屬性信息項的children 屬性.

    • 屬性節(jié)點來自屬性信息項。屬性節(jié)點擴展名的局域部分來自local name 屬性。屬性節(jié)點擴展名的命名空間 URI 來自 namespace URI 屬性。 節(jié)點的 字串值 來自將 每一個children 屬性成員的 character code 屬性相累加。

    • 正文節(jié)點來自一序列的連續(xù)的信息項。其節(jié)點的字串值來自連接每一個字符信息項 character code 屬性。.

    • 處理指令節(jié)點來自處理指令的信息項。其擴展名的局域部分來自 target 屬性。(其擴展名的命名空間 URI 部分為空。)其字串值來自content 屬性。文檔類型定義信息項的孩子是處理指令項的無處理指令節(jié)點。

    • 注釋節(jié)點來自注釋信息項。其字串值來自content 屬性。文檔類型定義信息項的孩子是注釋信息項的無注釋節(jié)點。

    • 命名空間節(jié)點來自命名空間聲明信息項。其擴展名的局域部分來自prefix 屬性。(其擴展名的命名空間 URI 部分為空。)其字串值來自命名空間 URI 屬性。.

    posted on 2006-08-23 11:20 Mongoose 閱讀(749) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 成人国产mv免费视频| eeuss影院ss奇兵免费com| 亚洲精品视频免费看| 久久精品国产亚洲av麻豆| 国产AV无码专区亚洲Av| 亚洲一区精品无码| 亚洲一区二区三区偷拍女厕| 国产亚洲色婷婷久久99精品91| 亚洲精品无码AV中文字幕电影网站| 国产成人在线观看免费网站| 午夜国产羞羞视频免费网站| 国产不卡免费视频| 亚洲AV日韩精品一区二区三区| 亚洲成片观看四虎永久| 国产L精品国产亚洲区久久| 中文字幕亚洲第一| 亚洲男人天堂av| 亚洲国产精品日韩在线观看| 亚洲宅男精品一区在线观看| 国产午夜亚洲精品| 美女黄频a美女大全免费皮| 一个人免费播放在线视频看片| 中文字幕乱理片免费完整的| 久久精品国产免费| 3344永久在线观看视频免费首页| 国产成人福利免费视频| 永久免费av无码网站大全| 亚洲国产成人精品91久久久| 伊人久久精品亚洲午夜| 亚洲欧洲国产日韩精品| 亚洲人成网站在线观看播放青青| 亚洲人成人网站18禁| 无套内谢孕妇毛片免费看看| 国产在线观看免费av站| 麻豆高清免费国产一区| 永久免费av无码网站大全| 亚洲色大成网站WWW久久九九| 亚洲精品视频免费看| 在线精品自拍亚洲第一区| 免费无码黄网站在线看| 97视频免费在线|