如何使用XSL和正则表达式来验证数据的有效性(二)
现在继续我在上一系列中介绍的例子。我们将实现一个简单的搜索机制, 也许你的兴趣不是在获取书籍的标题而是在要获得整个书节点(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 DOMDocu |
查看所有评论
