XML先容系列(10) - 新闻中心 - 正定县枫林商贸有限公司
现在的位置: 主页 > 新闻中心 > 文章正文
XML先容系列(10)
作者:正定县枫林商贸有限公司 来源:www.hbflsm.com 发布时间:2017-09-07 12:42:35
XML先容系列(10)


系列之十八:如何应用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 DOMDocument

bookXML.load('bookCatalog.xml')

Set nodelist=GetfilteredElements(bookXML,'xml')

而下面的代码将返回第一和第四本书的节点,然后你可以根据这些节点获取它们的

子节点的属性。

Set nodelist=GetfilteredElements(bookXML,'xml','//book')

通常,你应当尽可能的定义一个XSL的查询过滤器(filter)

由于它会只返回你需要的节点,会大大减少你需要处理的数据量。



这个函数是XML '数据库'的一个应用实例,由于很多SQL的开发者用熟悉了的

参数(例如LIKE)在XML中是没有等效的方法的,但是只要你在XML中能够熟练应用

正则表达式,你会发明它能够实现很多LIKE语句能够实现的功效。



应用XSL转换验证数据

正则表达式应用在XSL的转换中是一个强有力的验证数占领效的工具。

例如,你想根据XML的数据天生一个显示书籍标题和描写的table

当你应用基于DOM版本(就是应用微软的那个模型XDOM)的时候,XSL已经能够实现非常复杂的转换XML为

HTML的功效了。

在XSL的这个节点中<xsl:script>,答应你应用脚本语言。

你可以在输出流中插进文本(但是目前你就不能够把一个DOM节点输出到输出流中).

XSL中默认的脚本语言是JavaScript,

在应用的过程中你需要留心的是,由于'/'在JavaScript中是特别字符,你需要应用

'//'将其转意。

代码如下:

<xsl:stylesheet xmlns: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的脚本里面修正这个参数,

但是假如你应用了上面这个函数的话,可以让你的代码的可扩大性能更好。

留心的是,XSL的代码将被上面这个函数所修正

所以假如你想对雷同的XSL对象应用不同的过滤器(就是不同的查询条件的话)

需要应用XSL对象的clone(就是制作一个XSL的副本)方法。

下面就是一个完整的例子

<xsl:stylesheet xmlns:xsl=''>

<xsl:script language='JavaScript'><![CDATA[

IsValidBookTopic=/%searchStr/

]]></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>



然后你就可以应用下面这段代码来修正这个参数了

呵呵,我是搞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)



同样,应用上面的方法,你就可以设置其他的参数了,例如浏览器的类型呀

ASP的查询参数呀,或则一个基于Web的组件呀。



应用正则表达式给XSL带来了强盛的功效。

固然,应用这种通用性很强的方法在目前也许你不会看到能够给你带来很

大的上风(重要是很少有人写XML的程序的说),但是在未来的编程过程中,

你将会领会到它的强盛威力了。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站建设 https://www.feimao666.com


  • 上一篇:jquery两个参数的详解
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 正定县枫林商贸有限公司 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100