天天看點

XML系列函數詳解

  本期介紹多個XSL對于VBScript、JScript增加的方法、屬性,以充分發揮XML的優勢,用于< xsl:script >、< xsl:eval >标記内表達式的編寫或< xsl:if >、< xsl:when >的expr屬性。

一、absoluteChildNumber 

含義:傳回結點相對于它所有的兄弟(不論名字是否相同)的序号

文法:absoluteChildNumber(node)

參數:node ── 對象,欲傳回編号的結點。

示例:

1、假定文檔結構為:< document >< head/ >< body/ >< /document >,其中document為頂層結點,下述表達式将輸出

< xsl:eval >

absoluteChildNumber(this.selectNodes("/document/body").item(0))

< /xsl:eval >

2、确定目前結點相對于其所有兄弟的序号

< xsl:eval >absoluteChildNumber(this)< /xsl:eval >

二、ancestorChildNumber

含義:從給定結點出發根據給定祖先結點名傳回最近的祖先結點的序号(相對于同名結點)。如果找不祖先,則傳回0。

文法:ancestorChildNumber(bstrNodeName, pNode)

參數:

bstrNodeName ── 字元串。被搜尋的祖先結點的名字。

pNode ── 對象。搜尋開始位置的結點。

示例:

查找目前結點最近的名為report祖先結點。

ancestorChildNumber("report",this)

三、attributes

含義:傳回結點屬性的集合

文法:object.attributes

參數:object ── 結點對象

示例:

目前結點屬性的個數

this.attributes.length

目前結點第三個屬性的值

this.attributs.item(2).value

或this.attributes.item(2).text

或this.attributes(2).text

注意:如果給定的下标大于屬性總和減1将出錯,第一個屬性的下标是0。

四、baseName

含義:傳回有名字空間限制的基本名,即不包括名字字首

文法:object.baseName

參數:object ── 結點對象

示例:目前結點的基本名:this.baseName

五、childNumber

含義:傳回結點相對于同名同胞的序号

文法:childNumber(object)

參數:object ─? 岬愣韻?/p> 

示例:假定XML文檔結構如下

< x >< y >< z >< z/ >< y/ >< /x >

如果目前結點是z ,則childNumber(this)傳回1,而absoluteChildNumber(this)傳回3。 

六、dataType

含義:設定或讀取結點的資料類型

文法:設定結點的資料類型 object.dataType=objvalue

讀取結點的資料類型 objvalue=object.dataType

參數:object ── 結點對象

示例:讀取目前結點的資料類型

dtType=this.dataType

七、depth

含義:指定結點出現在文檔樹上的深度,即該結點位于文檔第幾層,頂層結點位于

第一層,根結點(即用“/”表示的結點)位于第0層

文法:depth(pNode)

參數:pNode ── 結點對象

示例:目前結點的深度

depth(this)

八、firstChild、lastChild

含義:傳回結點的第一個子結點(或最後一個子結點)。

文法:pNode.firstChild

pNode.lastChild

參數:pNode ── 結點對象

示例:目前結點的第一個結點的名字

this.firstChild.nodeName

九、formatIndex

含義:用指定的計數系統格式化提供的整數。

文法:formatIndex(lIndex, bstrFormat)

參數:

lIndex ── 整型數值或變量

bstrFormat ── 資料格式,可選值有a、A、i、I、1、01(以0打頭的數值形式,如果要求固定長度的編号如0001、0002則非常有用)

示例:目前結點的大寫羅馬數字編号

formatIndex(childNumber(this),"I")

十、formatNumber

含義:以指定格式輸出數值。

文法:formatNumber(dblNumber, bstrFormat)

參數:說明同formatNumber,不同之處在于格式化的可以是小數

示例:對變量a的值格式化為兩位小數 formatNumber(a,"#.00")

十一、hasChildNodes

含義:如果結點有子結點則傳回true(-1),否則為false(0)

文法:pNode.hasChildNodes()

注意:與此前介紹的函數不同,此函數後必須帶一個空括号

示例:判斷目前結點是否有子結點

this.hasChildNodes

十二、namespaceURI、prefix

含義:傳回結點名字空間的全局資源辨別符(或字首)

文法:pNode.namespaceURI

pNode.prifix

十三、nextSibling、previousSibling、parentNode

含義:傳回結點的下一個兄弟(或前一個兄弟、或結點的父結點)

文法:pNode.nextSibling

pNode.previousSibling

pNode.parentNode

  注意:對根結點(即“/”)應用parentNode方法、對第一個孩子結點應用previousSibling方法、對最後一個孩子結點應用nextSibling方法均會導緻錯誤,可通過此過關系運算符==(等于)和!=(不等于)來判斷一個結點是否某一指定結點,格式為pNode1 = pNode2或pNode2 != pNode2。

十四、nodeName

含義:傳回元素、屬性、入口的名字或其他類型結點的一個特定字元串

文法:pNode.nodeName

示例:目前結點的名字

this.nodeName

十五、nodeType、NodeTypeString

含義:傳回結點的類型的數值形式(或字元串形式)

文法:pNode.nodeType或pNode.nodeTypeString

傳回值:

結點類型

結點類型編号 結點類型字元串

元素

1

"element"

元素屬性

2

"attribute"

Markup-Delimited Region of Text 

3

"text"

Processing Instruction 

7

"processing_instruction"

Comment 

8

"comment"

Document Entity 

9

"document"

十六、nodeTypedvalue

含義:以結點預定義的資料類型傳回結點的值

文法:pNode.nodeTypedvalue

示例:假定目前結點的資料類型是fixed.14.4,下例将以數值傳回結點的值,而不是文本一個字元串

this.nodeTypedvalue

十七、nodevalue

含義:傳回結點的文本

文法:pNode.nodevalue

注意:該方法不用于元素類結點,可用于屬性、CDATA、注釋、文本等結點

示例:目前元素第一個屬性的值

this.attributes(0).nodevalue

目前元素内的文本(假定該元素内隻有文本,無其它元素,即< mark >text< /mark >,建議多嘗幾次掌握其确切的用法)

this.firstChild.nodevalue

十八、ownerDocument

含義:傳回包含該結點的文檔的根

文法:pNode.ownerDocument

注意:該方法用于文檔的根結點将出錯

十九、selectNodes

含義:給定的樣式比對應用于目前結點并傳回比對的結點集合

文法:pNode.selectNodes("pattern")

提示:pattern的編寫與< xsl:for-each >的select屬性的值類似,其中以“/”開頭表示

從文檔的根出發搜尋;以“//”開頭表周遊文檔的所有結點;以“..”開頭

表示從目前結點的父結點開始;如果欲從目前結點向下搜尋則不能有以上特殊字元打頭。

示例:與目前結點同名的元素在其父元素内的個數

childNumber(this.selectNodes("../"+this.nodeName+"[end()]").item(0))

目前元素内名字為“skill”的元素的個數

childNumber(this.selectNodes("skill[end()]").item(0))

二十、selectSingleNode

含義:與selectNodes類似,不同的隻傳回比對的第一個結點、而不是結點集合

文法:pNode.selectSingleNode("pattern")

示例:與目前結點同名的元素在其父元素内的個數

childNumber(this.selectSingleNode("../"+this.nodeName+"[end()]"))

目前元素内名字為“skill”的元素的個數

childNumber(this.selectSingleNode("skill[end()]"))

二十一、text

含義:傳回結點與它的子樹内的文字内容

文法:pNode.text

示例:整個文檔内的文字内容

this.ownerDocument.text

目前元素及其子樹的文字内容

this.text

二十二、xml

含義:傳回結點及其後代的XML表示

文法:pNode.xml

示例:目前文檔的XML内容

this.ownerDocument.xml

另有幾個函數不作介紹,列于其下以供參考,如感興趣,請通路​​http://msdn.microsoft.com​​擷取詳細說明。

formatTime(varTime, bstrFormat,varDestLocale) 
formatDate(varDate, bstrFormat,varDestLocale)
apendChild(newChild)
definition
CloneNode
insertBefore(newChild, refChild)
parsed
removeChild(oldChild)
replaceChild(newChild, oldChild)
specified
transformNode(stylesheet)
transformNodeToObject(stylesheet,outputObject) 
uniqueID(pNode)      

XSL函數一 

  本期學習XSL樣式方法,即可用于XSL元素< xsl:for-each >、< xsl:value-of >、< xsl:template >的select屬性、< xsl:apply-templates >的match屬性、< xsl:if >、< xsl:when >的test屬性中,對元素的範圍進行篩選,進而提供更大的靈活性。

  XML與DHTML(動态HTML)一樣,這些節點都是一個個對象,而且這些對象都是有層次的,從根節點開始構成一顆層次清淅的樹狀結構,這就形成了文檔對象模型DOM,通過對象的屬性、方法來達到通路控制XML節點的目的。

  我們這裡不打算就XML的DOM逐一詳細闡述,因為這完全可以寫成一個篇幅較多的教程,我們先就一些常見的方法作一些讨論,以期對DOM的對象方法有一個大緻的了解。

  注:從本期開始,所有示例不再提供完整源代碼,如有不明白之處,請仔細閱讀前面七期、并動手練手。

一、end()

含義:傳回集合中最後一個元素。

示例:輸出最後一份履歷

假定XML檔案格式為:

……< resume >…< /resume >……< resume >…< /resume >……      

相應XSL檔案内容為:

< xsl:for-each select="resume[end()]" >……< /xsl:for-each >      

< xsl:templates match="resume[end()]" >……< /xsl:templates >      

< xsl:apply-template select="resume[end()]" >……< /xsl:apply-template >      

二、index()

含義:傳回該元素在集合中的位置,傳回值是一整數,其中第一個元素傳回0

示例:傳回前面三份履歷

resume[index() $le$ 3]

注意:index()是與父元素相關的,請看下例:

< x >
< y/ >
< y/ >
< /x >
< x >
< y/ >
< y/ >
< /x >      

傳回所有< x >中的第一個< y >

x/y[index()=0] 或x/y[0]

三、nodeName()

含義:傳回元素的名字,即标記名

示例:選擇任意元素,假如其名字(即标記名)等于“name”

*[nodeName()="name"] 或 *[name]

四、number()

含義:将值轉換為數值形式,如果不是數值則傳回空,要求參數

示例:年齡(age) ?0歲的人的履歷(resume)

resume[number(age) $lt$ 30] 或resume[age $lt$ 30]

五、nodeType()

含義:傳回結點類型,結果為是數值。以下是傳回值清單:

結點類型

結點類型值 結點的字元形式描述

Element
1
"element"Element Attribute 
2
"attribute"Markup-Delimited Region of Text 
3
"text"Processing Instruction 
7
"processing_instruction"Comment
8
"comment"Document Entity
9
"document"      

六、value()

含義:傳回元素或屬性的值

示例:value()是元素或屬性的預設方法,以下表示是等價

name!value()="NAME"與name="NAME"

@attr="attribute_value"與@attr="attribute_value"

注:@是屬性字首,@attr表示是屬性attr

七、attribute()

含義:傳回所有屬性結點的集合,等價于“@*”

示例:尋找所有的resume元素,滿足條件至少有一個屬性的值為“ABC”

resume[$any$ attribute()="ABC"]或resume[$any$ @*="ABC"]

尋找所有的resume元素,滿足條件至少有一個子元素有一個屬性的值為“ABC”

resume[$any$ */attribute()="ABC"]或resume[$any$ */@*="ABC"]

八、comment()

含義:傳回所有注釋結點

示例:例如

resume[$any$ comment()="禹希初的履歷"]

表示尋找含有注釋語句

< !--禹希初的履歷-- >

的元素< resume >

九、cdata()

含義:傳回所有CDATA類型的結點的集合

示例:例如 

resume[$any$ cdata()="禹希初的履歷"]

表示尋找含有下述語句(必須是直接子結點)

< ![CDATA[禹希初的履歷]] >

的元素< resume >

十、node()

含義:傳回目前上下文環境中除根結點和屬性結點以外的所有結點的集合,等價于

“* | pi() | comment() | text()”

示例:尋找所有元素resume,其最後一個結點的名字為"skill"

resume[node()[end()]!nodeName()="skill"]

尋找所有resume元素的第一個結點:resume/node()[0]

十一、textnode()

含義:傳回所有文本類型的結點的集合

示例:尋找每一個p元素的第二個文本結點