怎樣使用XSL和Regex來驗證資料的有效性(二)

來源:互聯網
上載者:User
資料|正則 現在繼續我在上一系列中介紹的例子。我們將實現一個簡單的搜尋機制,
也許你的興趣不是在擷取書籍的標題而是在要獲得整個書節點(note)上。
那麼使用下面這個函數就能夠滿足你的要求了
Public Function GetFilteredElements(activeElement As Variant, RegExpfilter As String, _
Optional queryString As String = "",optional IsGlobal as Boolean=True, _
optional IgnoreCase as Boolean = True) As IXMLDOMNodeList
Dim re As RegExp
Dim filterDoc As DOMDocument
Dim nodelist As IXMLDOMNodeList
Dim filterList As IXMLDOMNodeList
Dim node As IXMLDOMElement
Dim baseNode As IXMLDOMElement
Set re = New RegExp
On Error GoTo ErrorHandler
Select Case TypeName(activeElement)
Case "IXMLDOMElement"
Set baseNode = activeElement
Case "DOMDocument"
Set baseNode = activeElement.documentElement
Case Else
Error 1001
Set GetFilteredElements = Nothing
End Select
re.Pattern = RegExpfilter
re.Global=IsGlobal
re.IgnoreCase=IgnoreCase
If queryString = "" Then
Set filterList = baseNode.selectNodes(".[textnode()]|.//*[textnode()]")
Else
Set filterList = baseNode.selectNodes(queryString)
End If
For Each node In filterList
If re.Test(node.Text) Then
node.setAttribute "filter:filteredElementFound", "true"
End If
Next
Set filterList = baseNode.selectNodes(".[@filter:filteredElementFound]|.//*[@filter:filteredElementFound]")
For Each node In filterList
node.removeAttribute "filter:filteredElementFound"
Next
Set GetFilteredElements = filterList
Exit Function
ErrorHandler:
If Err.Number = 1001 Then
MsgBox "Document must be an XML document, or a document element."
Else
Error Err.Number
End If
End Function

下面是對這個方法的簡單描述:
GetFilteredElements主要是用來擷取一個XML的文檔或則一個文檔裡面的節點,並且
按照我們的需要轉換它(包括所有的該節點的子節點),將轉換後的節點放到一個
清單類型IXMLDOMNodeList中.
這個過濾器程式按次序對每個節點進行運用,如果一個節點的文本滿足了運算式的話,
那麼這個節點就被做上一個臨時屬性的標記為filter:filteredElementFound
(當然為了不和你自己的XML文檔裡已經存在的標誌發生衝突,你可以把這個屬性
改成你需要的東西).
一旦所有的節點都被檢查完畢後,一個新的列表對象(僅僅只包含那些滿足運算式的
節點)被建立了。這些臨時的屬性會被刪除掉,然後返回那些節點。

如果你沒有給這個函數輸入查詢參數的話,
那麼將獲得整個文檔的所有葉子節點(就是那些沒有子項目的節點)
如果你給這個函數輸入查詢參數的話,
那麼這個函數將返回滿足條件的節點或則子節點
例如,下面的代碼將返回第一本書的標題和描述的節點和第四本書的
描述節點
Dim bookXML=new DOMDocument
bookXML.load("bookCatalog.xml")
Set nodelist=GetfilteredElements(bookXML,"xml")
而下面的代碼將返回第一和第四本書的節點,然後你可以根據這些節點擷取它們的
子節點的屬性。
Set nodelist=GetfilteredElements(bookXML,"xml","//book")
通常,你應該儘可能的定義一個XSL的查詢過濾器(filter)
因為它會只返回你需要的節點,會大大減少你需要處理的資料量。

這個函數是XML "資料庫"的一個運用執行個體,因為很多SQL的開發人員用熟悉了的
參數(例如LIKE)在XML中是沒有等效的方法的,但是只要你在XML中能夠熟練使用
Regex,你會發現它能夠實現很多LIKE語句能夠實現的功能。

使用XSL轉換驗證資料
Regex使用在XSL的轉換中是一個強有力的驗證資料有效工具。
例如,你想根據XML的資料產生一個顯示書籍標題和描述的table
當你使用基於DOM版本(就是使用微軟的那個模型XDOM)的時候,XSL已經能夠實現非常複雜的轉換XML為
HTML的功能了。
在XSL的這個節點中<xsl:script>,允許你使用指令碼語言。
你可以在輸出資料流中插入文本(但是目前你就不能夠把一個DOM節點輸出到輸出資料流中).
XSL中預設的指令碼語言是JavaScript,
在使用的過程中你需要注意的是,由於"/"在JavaScript中是特殊字元,你需要使用
"//"將其轉意。
代碼如下:
<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="//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>
當然,你也可以改變你的XSL中的查詢參數(例如上面例子中使用的參數是xml)
一個直接的方法是產生一個參數實體"entities"
例如下面的代碼,你需要使用"%"字元來說明一個字元是參數。
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文檔設定參數。
當然你也可以不使用上面這個函數,直接在XSL的指令碼裡



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。