用XML和XSLT实现动态查询

用XML和XSLT实现动态查询
内容:
1.引言
2.XML和XSLT的概念
3.如何用XML和XSLT实现动态查询
4.结束语
参考资料
关于作者

卓群 (zhuoqun@163.net)
中山大学计算机科学系99研
2001 年 11 月

本文提出了一种用XML和XSLT实现动态查询的方法。文中首先分析了该方法在实际中的应用背景,然后以WINDOWS NT平台为例说明了具体的实现方法,并在文章的后面部分附有实际代码以供分析。

1.引言
在以往的服务器端动态页面查询中,使用的一般都是基于CGI程序或各种脚本程序的方式。之所以考虑用XML和XSLT实现动态查询是基于以下的实际问题。假设有一家飞机制造公司向一家航空公司出售了自己生产的飞机,飞机制造商向航空公司提供必要的信息,用于飞机的日常维护。假设在飞机制造商的数据库中有一个飞机零件表,表中的每一项纪录均对应于一个飞机部件,记载了该部件的编号、名称以及其他的属性。现在航空公司的工程师需要查询某一个零件,或某一些名字有共同特征的零件。出于安全性以及性能方面的原因,飞机制造商不希望航空公司直接从自己的数据库中查找信息。我们的问题是如何实现这样的定制查询。

一个容易想到的也是传统的办法是飞机制造商帮助航空公司在自己的服务器上建立数据库存储所有的数据,再用服务器端的CGI程序或脚本程序生成动态页面的方法来实现动态查询。这种方法在需要实时更新数据的系统中仍不失为一种好方法,但在我们的系统中没有这个要求。另外因为数据库连接需要消耗一定的资源,采用这种方法会降低系统的效率并增加系统的复杂性,且不同数据库之间的数据传输本身是复杂的。有没有更直接的解决办法呢,我认为随着XML标准的不断完善和发展,采用XML和XSLT的技术实现信息的发布和动态查询在我们假设的实际应用中是非常有效的。

2.XML和XSLT的概念
XML(eXtensible Markup Language)以其自身的可扩展性、开放性和互操作性等特点被认为是新一代的网络语言。它最初被设计为SGML的一个子集,因此,它保留了SGML的基本优点,如与特殊表达方式分离的"抽象"数据的概念。此外,由于XML的主要传播媒介是Web,它被设计成一组相关技术的核心,包括可扩展样式语言XSL,XML链接语言,XML名称空间等。其中XSL的全称为eXtensible Stylesheet Language,既可扩展标记语言。它是专门用于XML的显示的样式表语言,对同一个XML文件使用不用的样式表可以实现不同的显示内容和方式。XSL包括三个部分:XSLT(XSL Transform)是一种转换XML文档的语言,XPath是一种定义XML节点路径的语言,XML Formatting Objects是一种定义XML显示的语言。本文中主要使用的是XSLT语言,在一系列包含在样式表中的过滤器和模式基础上,XSLT取一个XML文档(称为源文档)并输出该文档的一个结果树。

XML的最大特点在于它的独立于平台地表示数据,象Java语言实现了程序的平台无关性一样,XML实现了数据的平台无关性。XML能过轻而易举地交换数据,因此被广泛地应用于很多方面:如与媒体无关的全球出版,数据搜索和检索,Web网站管理,个性化出版,事件驱动的数据库交互,应用程序之间的通信,电子商务等等。

3.如何用XML和XSLT实现动态查询
采用XML和XSLT实现动态查询要解决的一个问题是如何向XSLT文件传递查询参数。以下列举代码说明这种方法在WINDOWS NT上的实现,我们用到了三个文件:uint.xml, unit.xsl, query.asp。其中,unit.xml是零件清单的XML文档,unit.xsl是样式表,设定条件对unit.xml中的内容进行过滤并以一定的格式显示。而query.asp是一个服务器端的ASP脚本程序,它的作用有二,一是将查询条件传递到unit.xsl中,二是将unit.xml和unit.xsl结合生成客户端可以直接显示的HTML文件并将其返回给客户端。以下是文件清单:

  1. unit.xml文件内容:
    
    <?xml version="1.0"?>
    <?xml-stylesheet href="unit.xsl" type="text/xsl"?>
    <UNITLIST>
        <UNIT>
            <EIN>AC0470</EIN>
            <NAME>UNIT0001</NAME>
            <!--More other elements here. --> 
            …
        </UNIT>
    <UNIT>
            <EIN>AC0470</EIN>
            <NAME>UNIT0001</NAME>
        </UNIT>
    …
    </UNITLIST>

  • unit.xsl文件内容
    
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    <xsl:template match="/">
    	<HTML>
    	<HEAD>
    	<TITLE>Unit List</TITLE>
    	<LINK REL="STYLESHEET" HREF="style.css" MEDIA="all" TYPE="text/css"/>
    	</HEAD>
    	<BODY>
    	<xsl:for-each select="UINTLIST/UNIT">
    	<xsl:if expr="filter(this)">
      		<H3>Unit No. <xsl:value-of select="EIN"/></H3>
    		<H3>Unit Name: <xsl:value-of select="NAME"/></H3>
    		<!--More other elements here. --> 
     		…
    <HR/>
    	</xsl:if>
    	</xsl:for-each>
    	</BODY>
    	</HTML>
    </xsl:template>
    </xsl:stylesheet>
  • query.asp文件内容
    
    <%
    set xml = Server.CreateObject("Microsoft.XMLDOM")
    xml.async = false
    xml.load(Server.MapPath("unit.xml"))
    
    set xsl = Server.CreateObject("Microsoft.XMLDOM")
    xsl.async = false
    xsl.load(Server.MapPath("unit.xsl"))
    
    set root = xsl.documentElement
    set scriptElem = xsl.createElement("xsl:script")
    root.appendChild(scriptElem)
    set cdataElem = xsl.createCDATASection("substr = """ & Request("SUBSTR") & """;" &_
       "function filter(node){" &_
          "var total;" &_
          "total = node.selectSingleNode(""EIN"").text;" &_
          "return total.indexOf(substr)==0;" &_
       "}")
    root.lastChild.appendChild(cdataElem)
    
    xsl.save(Server.MapPath("temp.xsl"))
    xsl.load(Server.MapPath("temp.xsl"))
    Response.Write(xml.transformNode(xsl))
    %>

    以上清单简要地说明了我们的做法,数据过滤功能在部分完成,filter是一个定制的Javascript函数,它的作用是检查当前的零件编号是否以指定的字符串开始(该字符串由用户提交到Web服务器)。可以看到,我们的做法是根据查询条件定制一个过滤函数,然后将该过滤函数作为一个节点插入XSL文件中。这就解决了前面提出的如何向XSLT文件传递查询参数的问题。到此,整个动态查询功能已经完全实现了。

    4.结束语
    用XML和XSLT实现动态查询至少有以下好处:

    1. 实现方法简单直观,避免了脚本和数据库交互的复杂性。
    2. 可以方便地支持包括HTML文档在内的多种用户可使用文档类型。由于使用了XML文档实现数据的内容和表现形式的分离,不同的用户可使用文档之间的区别只在于各自使用的样式表不同。相信随着XML标准化的不断完善和发展,XML会在动态数据处理方面有更好的应用前景。

    参考文献:

    • 董少春、徐士进、陆现彩,基于XML的网络课程结构的表现、显示和查询,《计算机应用研究》,2001, Vol.8, 89-91.
    • 赵书良,XML应用研究,《计算机科学》,2001, Vol.28, 94-95.

    作者简介

    卓群,中山大学计算机科学系99级研究生,研究方向是模式识别。参加第六届全国人机语音通讯会议并入选论文《基于模糊高斯混合模型的说话人识别算法的一些改进》。E-mail: zhuoqun@163.net

posted on 2005-01-17 10:06  笨笨  阅读(1453)  评论(0编辑  收藏  举报

导航