posts - 431,  comments - 344,  trackbacks - 0

          當(dāng)前位置

          當(dāng)我們使用XSLT處理XML源文檔是,我們用Context來表示當(dāng)前正在被模板處理的節(jié)點位置。比如xsl:template match="/"語句中表示Context在文檔的根(root)節(jié)點。我不知道如何準(zhǔn)確的翻譯Context這個詞,它類似于C語言里的指針,表示程序當(dāng)前運行的位置。理解Context對于正確處理XSL模板非常重要,當(dāng)您的XSL模板輸出的文檔和您想要的不一樣,最先應(yīng)該分析的就是Context在哪里。

          Location Paths是用于設(shè)定你想要尋找的Context節(jié)點位置。就類似DOS的目錄命令。我們看個例子

          <xsl:for-each select="child::PEOPLE/descendant::PERSON"> 
          

          其中child::PEOPLE/descendant::PERSON就是XPath語法,這個表達(dá)式就是一個Location Paths,代碼說明要顯示所有PEOPLE元素的子元素和所有PERSON元素的子元素。通常我們會采用更簡單的寫法:

          <xsl:for-each select="PEOPLE//PERSON"> 
          
          我們來解釋path的兩種表示方法:"/"和"http://"。
          
          "/"是表示當(dāng)前文檔的節(jié)點,類似DOS目錄分割符。
          
          例如:
          
          /PEOPLE表示選擇根節(jié)點下的PEOPLE元素;
          
          PEOPLE/PERSON表示選擇PEOPLE元素下所有的PESON子元素。
          
          "http://"則表示當(dāng)前文檔所有的節(jié)點。類似查看整個目錄。
          
          例如:
          
          //PEOPLE表示選擇文檔中所有的PEOPLE元素,無論它在什么層次;
          
          PEOPLE//PERSON表示在PEOPLE元素下所有的PERSON元素,無論它的層次多深。
          
          

          尋址操作

          Axis和Predicate是XPath語法中對Location Paths進行定位操作的語法,具體的用法列表如下

          Axis語法表
          --------------------------------------------------------
          表達(dá)式 簡寫 說明
          --------------------------------------------------------
          self . 選擇當(dāng)前的節(jié)點.。
          例子 :
          <TD><xsl:value-of select="."/></TD>
          代碼表示在當(dāng)前位置插入當(dāng)前的節(jié)點包含的文本(text)值,
          --------------------------------------------------------
          parent .. 選擇當(dāng)前節(jié)點的父節(jié)點。 
          --------------------------------------------------------
          attribute @ 選擇一個元素的所有屬性。 
          例子:
          <TD><xsl:value-of select="@PERSONID"/></TD>
          選擇PERSON元素的所有屬性.
          --------------------------------------------------------
          child 選擇當(dāng)前節(jié)點的所有子元素。
          --------------------------------------------------------
          ancestor 選擇當(dāng)前節(jié)點的所有父元素(包括父元素的父元素,類推)
          --------------------------------------------------------
          

          Axis幫助我們選擇當(dāng)前節(jié)點周圍所有的節(jié)點,而Predicate則用來定位當(dāng)前節(jié)點內(nèi)部的元素。表示方法為方括號[]中加表達(dá)式:[ Expression ]。具體舉例如下:

          PERSON[position()=2] 
          這句代碼表示尋找第二個"PERSON" 元素
          
          PERSON[starts-with(name, "B")] 
          這句代碼表示尋找所有名稱以"B"開頭的PERSON元素。 
          

          運算符

          這一節(jié)介紹XPath的運算符(Expressions),列表如下:

          --------------------------------------------------------
          運算符 說明
          --------------------------------------------------------
          and, or 就是普通意義的and, or 
          --------------------------------------------------------
          = 等于
          --------------------------------------------------------
          != 不等于
          --------------------------------------------------------
          >, >= 大于,大于等于
          --------------------------------------------------------
          <, <= 小于,小于等于。注意:在XSL文件中,<符號要用&lt; 表示
          --------------------------------------------------------
          +, -, *, div 加減乘除 
          --------------------------------------------------------
          mod 取模
          --------------------------------------------------------
          | 兩個節(jié)點一起計算
          --------------------------------------------------------
          

          功能函數(shù)(Functions)

          在XPath里有很多功能函數(shù)可以幫助我們精確尋找需要的節(jié)點。

          count()功能
          作用:統(tǒng)計計數(shù),返回符合條件的節(jié)點的個數(shù)。
          舉例:<p><xsl:value-of select="count(PERSON[name=tom])"/></p>
          說明:代碼的用途是顯示PERSON元素中姓名屬性值為tom有幾個。
          
          number()功能
          作用:將屬性的值中的文本轉(zhuǎn)換為數(shù)值。
          舉例:<p>The number is: <xsl:value-of select="number(book/price)"/></p>
          說明:代碼的用途是顯示書的價格。
          
          substring() 功能
          語法:substring(value, start, length)
          作用:截取字符串。
          舉例:<p><xsl:value-of select="substring(name, 1, 3)"/></p>
          說明:代碼的用途是截取name元素的值,從第一個字母開始顯示到第三個。
          
          sum()功能
          作用:求和。
          舉例:<p>Total Price = <xsl:value-of select="sum(//price)"/></p>
          說明:代碼的用途是計算所有價格的和。









          normalize-space()刪除了前部和尾部的空格

          //BBB[normalize-space(@name)='bbb']------ 選擇含有屬性 name 且其值 ( 在用 normalize-space 函數(shù)去掉前后空格后 ) 'bbb' BBB 元素

          name()
          函數(shù)返回元素的名稱
          //*[name()='BBB']----選擇所有名稱為BBB的元素(這里等價于//BBB)


          start-with() 函數(shù)在該函數(shù)的第一個參數(shù)字符串是以第二個參數(shù)字符開始的情況返回 true
          //*[starts-with(name(),'B')]-----選擇所有名稱以"B"起始的元素
          contains()
          函數(shù)當(dāng)其第一個字符串參數(shù)包含有第二個字符串參數(shù)時返回 true.
          //*[contains(name(),'C')]-----選擇所有名稱包含"C"的元素

          多個路徑可以用分隔符 | 合并在一起,可以合并的路徑數(shù)目沒有限制
          //CCC | //BBB-----選擇所有的CCCBBB元素
          /AAA/EEE | //BBB--- 選擇所有的 BBB 元素和所有是 AAA 的子元素的 EEE 元素
          <AAA>
                    <
          BBB
          />
                    <CCC/>
                    <DDD>
                         <CCC/>
                    </DDD>
                    <
          EEE
          /> 
          </AAA>

          child (axis) 包含上下文節(jié)點的子元素 , 作為默認(rèn)的軸 , 可以忽略不寫 .
          /AAA----等價于 /child::AAA
          /AAA/BBB----等價于/child::AAA/child::BBB
          二者都可以被合并----/child::AAA/BBB

          descendant (后代)軸包含上下文節(jié)點的后代,一個后代是指子節(jié)點或者子節(jié)點的子節(jié)點等等, 因此descendant軸不會包含屬性和命名空間節(jié)點.
          /descendant::*-----選擇文檔根元素的所有后代.即所有的元素被選擇
          /AAA/BBB/descendant::*-----選擇/AAA/BBB的所有后代元素
          //CCC/descendant::*----選擇在祖先元素中有CCC的所有元素
          //CCC/descendant::DDD----選擇所有以CCC為祖先元素的DDD元素
            <AAA>
                    <BBB>
                         <DDD>
                              <CCC>
                                   <
          DDD
          />
                                   <EEE/>
                              </CCC>
                         </DDD>
                    </BBB>
                    <CCC>
                         <
          DDD
          >
                              <EEE>
                                   <
          DDD
          >
                                        <FFF/>
                                   </
          DDD
          >
                              </EEE>
                         </
          DDD
          >
                    </CCC
            </AAA>

          parent (axis) 包含上下文節(jié)點的父節(jié)點 , 如果有父節(jié)點的話
          //DDD/parent::*---選擇DDD元素的所有父節(jié)點

          ancestor(axis)包含上下節(jié)點的祖先節(jié)點, 該祖先節(jié)點由其上下文節(jié)點的父節(jié)點以及父節(jié)點的父節(jié)點等等諸如此類的節(jié)點構(gòu)成,所以ancestor軸總是包含有根節(jié)點,除非上下文節(jié)點就是根節(jié)點本身.
          /AAA/BBB/DDD/CCC/EEE/ancestor::*----選擇一個絕對路徑上的所有節(jié)點
             < AAA >
                    <
          BBB
          >
                         <
          DDD
          >
                              <
          CCC
          >
                                   <DDD/>
                                   <EEE/>
                              </
          CCC
          >
                         </
          DDD
          >
                    </
          BBB
          >
                    <CCC>
                         <DDD>
                              <EEE>
                                   <DDD>
                                        <FFF/>
                                   </DDD>
                              </EEE>
                         </DDD>
                    </CCC
             </
          AAA >

          //FFF/ancestor::*----- 選擇 FFF 元素的祖先節(jié)點

          following-sibling (axis) 包含上下文節(jié)點之后的所有兄弟節(jié)點
          /AAA/BBB/following-sibling::*
          //CCC/following-sibling::*

          preceding-sibling (axis) 包含上下文節(jié)點之前的所有兄弟節(jié)點
          /AAA/XXX/preceding-sibling::*
          //CCC/preceding-sibling::*
                <AAA>
                    <
          BBB>
                         <CCC/>
                         <DDD/>
                    </
          BBB>
                    <
          XXX>
                         <DDD>
                              <
          EEE/>
                              <
          DDD/>
                              <CCC/>
                              <FFF/>
                              <FFF>
                                   <GGG/>
                              </FFF>
                         </DDD>
                    </
          XXX>
                    <CCC>
                         <DDD/>
                    </CCC>
               </AAA>

          following (axis) 包含同一文檔中按文檔順序位于上下文節(jié)點之后的所有節(jié)點 , 除了祖先節(jié)點 , 屬性節(jié)點和命名空間節(jié)點

          /AAA/XXX/following::*
              <AAA>
                    <BBB>
                         <CCC/>
                         <ZZZ>
                                <EEE/>
                         </ZZZ>
                         <FFF>
                              <GGG/>
                         </FFF>
                    </BBB>
                    <XXX>
                         <DDD>
                              <CCC/>
                              </DDD>
                    </XXX>
                    <
          CCC
          >
                         <
          DDD
          />
                    </
          CCC

              </AAA>
          //ZZZ/following::*
              <AAA>
                    <BBB>
                         <CCC/>
                         <ZZZ>
                              <DDD/>
                              <DDD>
                                   <EEE/>
                              </DDD>
                         </ZZZ>
                         <
          FFF>
                              <
          GGG/>
                         </
          FFF>
                    </BBB>
                    <
          XXX>
                         <
          DDD>
                              <
          EEE/>
                              <
          DDD/>
                              <
          CCC/>
                              <
          FFF/>
                              <
          FFF>
                                   <
          GGG/>
                              </
          FFF>
                         </
          DDD>
                    </
          XXX>
                    <
          CCC>
                         <
          DDD/>
                    </
          CCC>
               </AAA>

          preceding (axis) 包含同一文檔中按文檔順序位于上下文節(jié)點之前的所有節(jié)點 , 除了祖先節(jié)點 , 屬性節(jié)點和命名空間節(jié)點
          /AAA/XXX/preceding::*

               <AAA>
                    <
          BBB
          >
                         <
          CCC
          />
                         <
          ZZZ
          >
                              <
          DDD
          />
                         </
          ZZZ
          >
                    </
          BBB
          >
                    <XXX>
                         <DDD>
                              <EEE/>
                         </DDD>
                    </XXX>
                    <CCC>
                         <DDD/>
                    </CCC>
               </AAA>

          //GGG/preceding::*
               <AAA>
                    <
          BBB>
                         <
          CCC/>
                         <
          ZZZ>
                              <
          DDD/>
                         </
          ZZZ>
                    </
          BBB>
                    <XXX>
                         <DDD>
                              <
          EEE/>
                              <
          DDD/>
                              <
          CCC/>
                              <
          FFF/>
                              <FFF>
                                   <GGG/>
                              </FFF>
                         </DDD>
                    </XXX>
                    <CCC>
                         <DDD/>
                    </CCC>
               </AAA>

          descendant-or-self (axis) 包含上下文節(jié)點本身和該節(jié)點的后代節(jié)點
          /AAA/XXX/descendant-or-self::*

          ancestor-or-self (axis) 包含上下文節(jié)點本身和該節(jié)點的祖先節(jié)點
          /AAA/XXX/DDD/EEE/ancestor-or-self::*

          div 運算符做浮點除法運算
          mod
          運算符做求余運算
          floor
          函數(shù)返回不大于參數(shù)的最大整數(shù) ( 趨近于正無窮 )
          ceiling
          返回不小于參數(shù)的最小整數(shù) ( 趨近于負(fù)無窮 )

          //BBB[position() mod 2 = 0 ]---- 選擇偶數(shù)位置的 BBB 元素
          //BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]---- 選擇中間的 BBB 元素


          上面這些功能只是XPath語法中的一部分,還有大量的功能函數(shù)沒有介紹,而且目前XPath的語法仍然在不斷發(fā)展中。通過這些函數(shù)我們可以實現(xiàn)更加復(fù)雜的查詢和操作。

          看到這里,我們的入門教程就快結(jié)束了。通過走馬觀花式的快速學(xué)習(xí),希望大家對XSLT應(yīng)該有了一點基本概念:XSLT是一種轉(zhuǎn)換XML文檔的語言,它包含兩個過程:轉(zhuǎn)換和格式化。XSLT的功能比CSS強大得多,它有類似數(shù)據(jù)查詢的語法。如果您對XSLT感興趣,那么以上的知識是遠(yuǎn)遠(yuǎn)不夠的,需要查詢更多的資料。在最后一章附錄為大家提供了主要的XSLT資源。

          posted on 2006-09-18 09:18 周銳 閱讀(1049) 評論(0)  編輯  收藏 所屬分類: JavaXMLXSLT
          主站蜘蛛池模板: 佛冈县| 屏南县| 南阳市| 多伦县| 浦北县| 平遥县| 平顺县| 栾川县| 华安县| 吴堡县| 杭州市| 阿城市| 曲水县| 梁平县| 凤山县| 东乡县| 张家界市| 资兴市| 郎溪县| 辽中县| 正宁县| 东莞市| 奈曼旗| 嘉黎县| 双辽市| 河东区| 竹溪县| 永安市| 静宁县| 乐安县| 高台县| 镇江市| 遵义市| 清徐县| 东至县| 谷城县| 淮阳县| 开平市| 宁陵县| 徐闻县| 治县。|