利用XSLT把ADO记录集转换成XML(3)[转载]

利用XSLT把ADO记录集转换成XML(3)
http://www.51cto.com 2005-11-04 09:36 出处:51cto.com整理 <script language="javascript" src="/php/count.php?view=yes&artID=10816" type="text/javascript"></script>
 
 
 
ADO自动产生的XML包含了schema信息,它描述这个XML里允许有什么节点和属性以及采用何种数据类型,而且数据节点也增加了名称空间。schema信息在需要数据验证的地方或进行更复杂的处理或许很有用,但是,大多数情况下,我们使用的是瘦客户机,我们不需要schema信息。我们可以利用XSLT来分离出我们想要的信息,去掉多余的信息。因此,我们编写下面的“ DataCleaner.xsl”:

 

&lt;?xml version="1.0"?&gt;

&lt;xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"

xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"

xmlns:rs="urn:schemas-microsoft-com:rowset"

xmlns:z="#RowsetSchema"&gt;

&lt;xsl:output omit-xml-declaration="yes"/&gt;

&lt;xsl:template match="/"&gt;

&lt;xsl:element name="xml"&gt;

&lt;xsl:for-each select="/xml/rs:data/z:row"&gt;

&lt;xsl:element name="row"&gt;

&lt;xsl:for-each select="@*"&gt;

&lt;xsl:element name="{name()}"&gt;

&lt;xsl:value-of select="."/&gt;

&lt;/xsl:element&gt;

&lt;/xsl:for-each&gt;

&lt;/xsl:element&gt;

&lt;/xsl:for-each&gt;

&lt;/xsl:element&gt;

&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

这个XSLT具有可重用的特性,对于不同的查询结果都适用,下面就是如何使用这个XSLT的例子:

&lt;%

Dim strCleanXML, objXMLDOM_XSLT

Set objXMLDOM_XSLT = CreateObject("MSXML2.DOMDocument")

objXMLDOM_XSLT.load(Server.MapPath("DataCleaner.xsl"))

strCleanXML = objXMLDOM.transformNode(objXMLDOM_XSLT)

Set objXMLDOM = Nothing

Set objXMLDOM_XSLT = Nothing

%&gt;

经过上面的处理以后,strClaenXML就是我们所想要的XML字符串了。

&lt;xml&gt;

&lt;row&gt;

&lt;ProductName&gt;Chai&lt;/ProductName&gt;

&lt;UnitPrice&gt;18&lt;/UnitPrice&gt;

&lt;UnitsInStock&gt;39&lt;/UnitsInStock&gt;

&lt;/row&gt;

&lt;row&gt;

&lt;ProductName&gt;Konbu&lt;/ProductName&gt;

&lt;UnitPrice&gt;6&lt;/UnitPrice&gt;

&lt;UnitsInStock&gt;24&lt;/UnitsInStock&gt;

&lt;/row&gt;

&lt;/xml&gt;

上面这种格式的XML字符串是我们经常见到的节点集的样式,如果您不想把字段处理成节点,而把它处理成属性节点,那么我们只需对DataCleaber.xsl稍加改动即可:

&lt;?xml version="1.0"?&gt;

&lt;xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"

xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"

xmlns:rs="urn:schemas-microsoft-com:rowset"

xmlns:z="#RowsetSchema"&gt;

&lt;xsl:output omit-xml-declaration="yes"/&gt;

&lt;xsl:template match="/"&gt;

&lt;xsl:element name="xml"&gt;

&lt;xsl:for-each select="/xml/rs:data/z:row"&gt;

&lt;xsl:element name="row"&gt;

&lt;xsl:for-each select="@*"&gt;

&lt;xsl:attribute name="{name()}"&gt;

&lt;xsl:value-of select="."/&gt;

&lt;/xsl:attribute&gt;

&lt;/xsl:for-each&gt;

&lt;/xsl:element&gt;

&lt;/xsl:for-each&gt;

&lt;/xsl:element&gt;

&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

以下是采用了新样式的结果,它比用节点表示字段的长度要短的多了。传输起来速度会更快:

&lt;xml&gt;

&lt;row ProductName="Chai" UnitPrice="18" UnitsInStock="39"/&gt;

&lt;row ProductName="Konbu" UnitPrice="6" UnitsInStock="24"/&gt;

&lt;/xml&gt;

到此为止,我们介绍了从ADO 记录集得到XML格式数据的几种办法,也得到了最简化的字符串。但是有几个问题你仍然需要注意,有些字段值还有XML里不支持的字符,比如:"'&lt;&gt;&,象P&G宝洁公司的名称,Chef Anton's Gumbo Mix产品名字等,在做转换时要进行编码处理。在Microsoft ADO 2.6的SDK里有使用save方法时要注意的问题:1,save方法只对open Recordset起作用;2,不支持带有adVariant,adIDispatch,adIUnknown类型的字段的记录集的savw;3,当保存分级的记录集( data shapes)有两个限制:不能保存参数化和含有未解决的更新的记录集。

为了更进一步提高性能,你可以把转换工作放到COM/COM+组件中, ASP代码只进行数据的最终表现即可。把业务层、数据层和表现层分开,ASP只需要调用数据组件,数据组件调用数据库的存储过程,把结果转换成XML,最后只把简单的XML字符环串回到ASP程序里,ASP就可以用XSLT把XML进行转换,把结果送到浏览器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值