直播中
下面是對這個(gè)方法的簡單描述:
GetFilteredElements主要是用來獲取一個(gè)XML的文檔或則一個(gè)文檔里面的節(jié)點(diǎn),并且
按照我們的需要轉(zhuǎn)換它(包括所有的該節(jié)點(diǎn)的子節(jié)點(diǎn)),將轉(zhuǎn)換后的節(jié)點(diǎn)放到一個(gè)
列表類型IXMLDOMNodeList中.
這個(gè)過濾器程序按次序?qū)γ總€(gè)節(jié)點(diǎn)進(jìn)行運(yùn)用,如果一個(gè)節(jié)點(diǎn)的文本滿足了表達(dá)式的話,
那么這個(gè)節(jié)點(diǎn)就被做上一個(gè)臨時(shí)屬性的標(biāo)記為filter:filteredElementFound
(當(dāng)然為了不和你自己的XML文檔里已經(jīng)存在的標(biāo)志發(fā)生沖突,你可以把這個(gè)屬性
改成你需要的東西).
一旦所有的節(jié)點(diǎn)都被檢查完畢后,一個(gè)新的列表對象(僅僅只包含那些滿足表達(dá)式的
節(jié)點(diǎn))被創(chuàng)建了。這些臨時(shí)的屬性會被刪除掉,然后返回那些節(jié)點(diǎn)。
如果你沒有給這個(gè)函數(shù)輸入查詢參數(shù)的話,
那么將獲得整個(gè)文檔的所有葉子節(jié)點(diǎn)(就是那些沒有子元素的節(jié)點(diǎn))
如果你給這個(gè)函數(shù)輸入查詢參數(shù)的話,
那么這個(gè)函數(shù)將返回滿足條件的節(jié)點(diǎn)或則子節(jié)點(diǎn)
例如,下面的代碼將返回第一本書的標(biāo)題和描述的節(jié)點(diǎn)和第四本書的
描述節(jié)點(diǎn)
Dim bookXML=new DOMDocument
bookXML.load("bookCatalog.xml")
Set nodelist=GetfilteredElements(bookXML,"xml")
而下面的代碼將返回第一和第四本書的節(jié)點(diǎn),然后你可以根據(jù)這些節(jié)點(diǎn)獲取它們的
子節(jié)點(diǎn)的屬性。
Set nodelist=GetfilteredElements(bookXML,"xml","http://book")
通常,你應(yīng)該盡可能的定義一個(gè)XSL的查詢過濾器(filter)
因?yàn)樗鼤环祷啬阈枰墓?jié)點(diǎn),會大大減少你需要處理的數(shù)據(jù)量。
這個(gè)函數(shù)是XML "數(shù)據(jù)庫"的一個(gè)運(yùn)用實(shí)例,因?yàn)楹芏郤QL的開發(fā)者用熟悉了的
參數(shù)(例如LIKE)在XML中是沒有等效的方法的,但是只要你在XML中能夠熟練使用
正則表達(dá)式,你會發(fā)現(xiàn)它能夠?qū)崿F(xiàn)很多LIKE語句能夠?qū)崿F(xiàn)的功能。
使用XSL轉(zhuǎn)換驗(yàn)證數(shù)據(jù)
正則表達(dá)式使用在XSL的轉(zhuǎn)換中是一個(gè)強(qiáng)有力的驗(yàn)證數(shù)據(jù)有效的工具。
例如,你想根據(jù)XML的數(shù)據(jù)生成一個(gè)顯示書籍標(biāo)題和描述的table
當(dāng)你使用基于DOM版本(就是使用微軟的那個(gè)模型XDOM)的時(shí)候,XSL已經(jīng)能夠?qū)崿F(xiàn)非常復(fù)雜的轉(zhuǎn)換XML為
HTML的功能了。
在XSL的這個(gè)節(jié)點(diǎn)中<xsl:script>,允許你使用腳本語言。
你可以在輸出流中插入文本(但是目前你就不能夠把一個(gè)DOM節(jié)點(diǎn)輸出到輸出流中).
XSL中默認(rèn)的腳本語言是JavaScript,
在使用的過程中你需要注意的是,由于"/"在JavaScript中是特殊字符,你需要使用
"http://"將其轉(zhuǎn)意。
代碼如下:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:script language="JavaScript"><![CDATA][
IsValidBookTopic=/xml/
]]></xsl:script>
<xsl:template match="/">
<xsl:apply-templates select="http://book" />
</xsl:template>
<xsl:template match="book">
<xsl:if expr="IsValidBookTopic.test(this.text)">
<h1><xsl:value-of select="title"/></h1>
<h2><xsl:value-of select="author"/></h2>
<p><xsl:value-of select="description"/></p>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
當(dāng)然,你也可以改變你的XSL中的查詢參數(shù)(例如上面例子中使用的參數(shù)是xml)
一個(gè)直接的方法是生成一個(gè)參數(shù)實(shí)體"entities"
例如下面的代碼,你需要使用"%"字符來說明一個(gè)字符是參數(shù)。
Function SetXSLParameter(XslDoc as DOMDocument ,ParamName as _
String,ParamValue as Variant) as DOMDocument
Dim XslDoc as DOMDocument
Dim ScriptNode as IXMLDOMElement
Dim re as RegExp
Set re=new RegExp
Re.global=True
Re.IgnoreCase=True
Re.pattern="%"+ParamName
For each ScriptNode in xslDoc.selectNodes("xsl:script")
ScriptNode.text=Re.replace(ScriptNode.text,cstr(ParamValue))
Next
Return XslDoc
End Function
SetXSLParameter用來給XSL文檔設(shè)置參數(shù)。
當(dāng)然你也可以不使用上面這個(gè)函數(shù),直接在XSL的腳本里面修改這個(gè)參數(shù),
但是如果你使用了上面這個(gè)函數(shù)的話,可以讓你的代碼的可擴(kuò)展性能更好。
注意的是,XSL的代碼將被上面這個(gè)函數(shù)所修改
所以如果你想對相同的XSL對象使用不同的過濾器(就是不同的查詢條件的話)
需要使用XSL對象的clone(就是制作一個(gè)XSL的副本)方法。
下面就是一個(gè)完整的例子
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:script language="JavaScript"><![CDATA][
IsValidBookTopic=/%searchStr/
]]></xsl:script>
<xsl:template match="/">
<xsl:apply-templates select="http://book" />
</xsl:template>
<xsl:template match="book">
<xsl:if expr="IsValidBookTopic.test(this.text)">
<h1><xsl:value-of select="title"/></h1>
<h2><xsl:value-of select="author"/></h2>
<p><xsl:value-of select="description"/></p>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
然后你就可以使用下面這段代碼來修改這個(gè)參數(shù)了
呵呵,我是搞asp的,下面這段代碼就是寫在你的asp的程序中的。
Set xmlDoc=new DomDocument
Set xslDoc=new DOMDocument
XmlDoc.load "catalog.xml"
XslDoc.load "catalog.xsl"
SetXSLParameter xslDoc, "searchStr", "pair-o-dice"
Response.write xmlDoc.transformNode(xslDoc)
同樣,使用上面的方法,你就可以設(shè)置其他的參數(shù)了,例如瀏覽器的類型呀
ASP的查詢參數(shù)呀,或則一個(gè)基于Web的組件呀。
使用正則表達(dá)式給XSL帶來了強(qiáng)大的功能。
雖然,使用這種通用性很強(qiáng)的方法在目前也許你不會看到能夠給你帶來很
大的優(yōu)勢(主要是很少有人寫XML的程序的說),但是在未來的編程過程中,
你將會體會到它的強(qiáng)大威力了。