xsl入门的好文章
[原作者:宇宙人]
你从本文中学到的最重要的一点是XSL不仅仅是应用样式。当使用XML处理器时,XSL源文档中的信息将被评价、重新安排,然后重新组装。我们最终得到的不只是XML数据的可爱的版本 - 而是可以被容易地添加、修改和重新排序的灵活的源信息。这个最终产品叫做结果树(Result Tree)。
这通过一系列测试产生。下面是一个简单的例子:
<xsl:template match="recipe_name">
<P>
<xsl:process-children/>
</P>
</xsl:template>
最先要解释的是以"/" 结束的标记符是空的。即此种类型的标记符的起始和结束标记符之前什么也不发生。在HTML中类似的例子是<img>标记符。因为一个图像所需的所有信息都包含在一个标记符中,所以就没有必要存在结束标记符</img>。组织良好的XML文档可以接受空标记符,同时XSL样式表必须是组织良好的XML。
让我们再回到例子,它告诉XSL处理器如果发现一套<recipe_name>标记符,就应该分离出内容然后用<p>和</p>包围起来。或者,如果你想炫耀你的XSL的知识,你可以说“添加到结果树中。”
这是一个相当简单的测试,而且很典型。XML元素的内容被表现信息所包围。
现在让我们看看书写菜谱的XSL样式表的完整例子。
在我讲述更多的XSL标记之前,我要解释一个可能被问到的问题。谁都知道在HTML中<p>本身就足够了,那么我为什么要使用结束的</p>标记符呢?
有人能回答吗?答案是:没有对应的结束标记符,那部分就不是组织良好的XML,于是会产生一个致命的错误。
下面是一个完整的样式表。
<xsl:stylesheet>
<xsl:template match = "/">
<HTML>
<BODY>
<xsl:process-children/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match = "author">
<H1>
<xsl:process-children/>'s fabulous
</H1>
</xsl:template>
<xsl:template match = "recipe_name">
<H2>
<xsl:process-children/>
</H2>
</xsl:template>
<xsl:template match = "meal">
<TABLE><TR><TD><H3>EAT FOR:</H3></TD>
<TD><H3><xsl:process-children/></H3></TD>
</TR></TABLE>
</xsl:template>
<xsl:template match = "directions">
<H4>DIRECTIONS</H4>
<P>
<xsl:process-children/>
</P>
</xsl:template>
<xsl:template match = "ingredients">
<B>INGREDIENTS</B><BR></BR>
<xsl:process-children/>
</xsl:template>
<xsl:template match = "item">
<BR>
<xsl:process-children/>
</BR>
</xsl:template>
</xsl:stylesheet>
其结果不会使我得到任何设计奖,但是它是一个能起作用的XSL。这里可能只有下面的命令需要解释:
<xsl:template match = "/">
<HTML>
<BODY>
<xsl:process-children/>
</BODY>
</HTML>
</xsl:template>
第一行的"/"告诉处理器这个节点应用到XML文档的根上。于是,这部分中的命令是结果树的基础。处理器被告之把<HTML>和<BODY>标记符放在文档的开始和结尾处,然后处理或打印所有的子元素。因为它是根元素,所以意味着“打印所有的东西。”
现在,如果你考虑几秒钟,就会觉得有点古怪。如果根层的process-children命令把源代码传递给结果树,那么所有与模板匹配的节点都可以与已经经过处理的源码一起工作。
然而,出现的问题是:XSL有一套确定哪些内容被传递给结果树的规则,其中最重要的规则是,最特定的匹配将会赢。显然,元素名的模板匹配比根层的匹配更特定。因此,所有模板匹配的节点将超越根层的规则。
注意用XML数据添加HTML标记符是多么的容易。当XSL处理器看到那些不在XSL词汇表中的标记符时,就会把他们传递给结果树。如果你花些时间,就可能发现其中巨大的潜力。XSL可以被用做一种转换语言。存储在一个XML文件中的数据可以用完全不同的标记符转换到另一个文件中。还有,信息可以被修改成与可以对应一套不同的标记符集的XML应用程序一起工作的形式。
而且还不只这些,如人们所期望的,样式表可以用匹配的标记符打开和关闭,其中是一套组织良好的单元。 很好,但是还有限制。
简单的<xsl:template match>还不能完全满足我们的要求。比如,我希望当<course>标记符出现时取消<meal>标记符的内容。这样的话我就不用担心节面上同时显示"dinner"和"appetizer"。我可能还希望通过在最后的ingredient后面插入大量的空白来调整版面。
如同某个广告部的人说的:所有这些都是可能的 - 还要更多。SL有一套用来把元素与其父成员或子成员匹配的工具。它也允许位置上的匹配。例如,可以在第一个和最后一个某个特定元素上应用特定的格式,等等。
现在让我们考虑一些更复杂的事,比如令我在梦中出汗的任务。我需要菜谱名和它们的成分的清单。现在,如果我的网页与数据库没有联系,我就不得不写一个查询语句。因为我对SQL不太熟,所以需要得到的DBA帮助。但是如果知道XSL,我就会摆脱这些麻烦。
<xsl:style sheet>
<xsl:template match = "/">
<xsl:for-each select ="list/recipe">
<TABLE>
<TR><TD>
<xsl:process select = "recipe_name"/></TD>
<TD>
<xsl:for-each select = "ingredients/item">
<BR><xsl:process-children/></BR>
</xsl:for-each>
</TD></TR>
</TABLE>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果并不神奇。但是在table标记符中加些花样将没问题。显然,我在XML中存储了信息,但是我认为最好还是仔细看看。
<xsl:template match = "/">
<xsl:for-each select ="list/recipe">
第一行很熟悉,只是简单地与模板相匹配。但是第二行却有些不同 - 在元素清单中出现的每个菜谱元素做每件事,直到</xsl:for-each>标记符。然后我开始HTML表格,用<xsl:process select="recipe_name"/>标记符把recipe_name元素中的内容输出到表格单元中。在关闭第一个表格单元后,事情开始变酷。下一行(<xsl:for-each select="ingredient/item">)开始一个附加的嵌套循环,允许我把全部ingredient输出到合适的显示信息中。样式表的其余部分应该很好理解。
但是等等,我知道你在想:“他说过酷了吗?什么这么酷?”
for-each函数是XSL的几个程序化的特征之一。还有if-then和选择函数。这些特征允许任何人都可以以任何能想到的方式(或至少是可行的方式)容易地操纵XML内容。如果你能实现这些特征,就很酷。
既然你已经看到XML的一些功能,那么我想提出一个问题:通过把内容分离到组织良好和有效的XML文件中,XML对这些内容有哪些不能做的呢?如我前面显示的,数据可以被操纵然后放入你选择的版面中。或者数据可以被处理成可以被其它应用程序使用的形式。那么,还有其它的吗?
我们再一次面对扩展性的核心。一旦定义了数据,我们可以做任何想做的事。如果我们来到一个有能处理XML的字处理、电子表格和表现程序的时代,同一套数据几乎可以被用在任何用途上。
但是,哎!这依然是个梦。
我们只能希望浏览器能实现这些功能,但是我们没有理由乐观。即使Tim Bray,XML的教父,也说过对XSL的尝试只能在CSS标准完全实现之后才能实现。谁知道什么时候才能实现呢?而且这也不是唯一的问题。
XSL要排除另一个障碍。XSL规范有两个截然不同的部分。第一部分,是我们这里讨论的,处理数据结构。另一部分是一套用来应用样式的有格式的对象。这部分需要做大量工作。在我看来,现在需要很多人去做很多事。例如,应该有既适合屏幕又适合打印输出的命令。如果规范的制定者继续这种“无所不包”的尝试,此规范将最终很难实现,而且最终用户用起来也困难。但是现在,我们做不了什么 - 只能过我们自己快乐的小日子,同时盼望负责的同志们别把事情弄糟。
利用XSL和ASP在线编辑XML文档
[原作者:宇宙人]
本文通过一个详细的例子,来阐述了在线编辑XML文档数据的方法。由于Netscape对XML的支持比较弱,因此,要实现跨平台的数据交换,数据的处理必须在服务器端进行。要编辑XML文档,首先要做的事情就是怎样把这些数据提取并显示给访问者,XSL为我们显示XML文件提供了一个很好的解决方案。下面的例子就是利用XSL样式单把XML文档显示出来,供用户进行编辑,然后再把编辑后的数据提交到服务器,在服务器端进行数据的更新。这里采用ASP(Active Server Pages)来完成我们的任务。
首先,载入我们要进行编辑的XML文档,利用微软的文档对象模型(Microsoft XMLDOM Object)和XSL,XML文档就可以在服务器端转换成可以在客户端显示的HTML文件内容。下面先看看我们使用的XML和XSL文件是什么样子的。
XML文件:userdata.xml
<?xml version="1.0" encoding="gb2312"?>
<用户资料>
<field id="姓名" taborder="1">
<field_value>孟子</field_value>
</field>
<field id="性别" taborder="2">
<field_value>男</field_value>
</field>
<field id="单位名称" taborder="3">
<field_value>中国网络技术发展公司北京分公司</field_value>
</field>
<field id="详细地址" taborder="4">
<field_value>北京市嘉里中心102层</field_value>
</field>
<field id="电话" taborder="5">
<field_value>1391139136*</field_value>
</field>
<field id="电子邮件" taborder="6">
<field_value>amxh@21cn.com</field_value>
</field>
</用户资料>
XSL文件:userdata.xsl
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="' target=_blankhttp://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<body>
<form method="post" action="Edituserdata.asp">
<h1>用户资料编辑:</h1>
<table border="1" cellpadding="2">
<xsl:for-each select="用户资料/field">
<tr>
<td>
<xsl:value-of select="@id"/>
</td>
<td>
<input type="text"> <xsl:attribute name="id"> <xsl:value-of select="@id" /> </xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@id" /></xsl:attribute> <xsl:attribute name="value"> <xsl:value-of select="field_value" /> </xsl:attribute></input>
</td>
</tr>
</xsl:for-each>
</table>
<br />
<input type="submit" id="btnSubmit" name="btnSubmit" value="完成编辑" />
</form>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSL文件使用了XSL:for-each元素的来遍历整个XML文件,XML文件里每个“field”元素的“id”属性和HTML表单的文本输入框的“id”和“name”想对应。这样,HTML表单的文本输入框就显示出了XML文件的元素值。此文件负责XML文档在服务器端的转换,以便能在各种浏览器上显示。
下面是关键的程序,它实现打开和更新XML文档的功能,并根据表单的提交与否,来决定是否进行更新。它包含了两个函数,loadXMLFile负责载入和转换要显示的XML文件;updateXML函数负责更新XML文件。
Edituserdata.asp程序如下:
<%
''-----------------------------------------------------------
''定义函数 loadXMLFile(),接收二个参数:
''strXMLFile - XML 文件的路径和文件名字
''strXSLFilee - XSL 文件的路径和文件名字
''-----------------------------------------------------------
Function loadXMLFile(strXMLFile, strXSLFile)
''Declare local variables
Dim objXML
Dim objXSL
''实例化 XMLDOM 对象,以便载入 XML 文件。
set objXML = Server.CreateObject("Microsoft.XMLDOM")
''关掉文件异步载入模式。
objXML.async = false
''载入 XML 文件!
objXML.load(strXMLFile)
''实例化 XMLDOM 对象,以便载入 XSL 文件。
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
''关掉文件异步载入模式。
objXSL.async = false
''载入 XSL 文件!
objXSL.load(strXSLFile)
''利用 XMLDOM 的 transformNode 方法,把 XSL 样式表应用到 XML 文档,然后输出到客户端。
Response.Write(objXML.transformNode(objXSL))
End Function
''------------------------------------------------------------------
''函数 updateXML() 接收一个参数:strXMLFile - XML 文件的路径和文件名。
''------------------------------------------------------------------
Function updateXML(strXMLFile)
''声明局部变量。
Dim objDom
Dim objRoot
Dim objField
Dim x
''实例化 XMLDOM 对象。
set objDOM = Server.CreateObject("Microsoft.XMLDOM")
''关掉文件异步载入模式。
objDOM.async = false
''载入 XML 文件。
objDOM.load strXMLFile
''设定根元素。
Set objRoot = objDom.documentElement
''遍历 FORM 集合,并把提交的数据写入 XML 文件。
For x = 1 to Request.Form.Count
''检查提交的数据是否包含按钮。如果是,忽略此数据。
If instr(1,Request.Form.Key(x),"btn") = 0 Then
''按照 XSL 查询模式,建立 objField 变量,把表单的元素对应到 XML 文档里的相应元素[field_value]。
Set objField = objRoot.selectSingleNode("field[@id=''" & Request.Form.Key(x) & "'']/field_value")
''把表单提交的数据和 XML 文档里的节点值对应起来。
objField.Text = Request.Form(x)
End If
Next
''保存编辑过的 XML 文件。
objDom.save strXMLFile
''释放所有对对象的引用。
Set objDom = Nothing
Set objRoot = Nothing
Set objField = Nothing
''调用 loadXMLFile 函数,把新编辑后的 XML 文件用 updateduserdata.xsl 样式单显示到客户端。
loadXMLFile strXMLFile,server.MapPath("updateduserdata.xsl")
End Function
''检查表单是否成功提交,如提交,更新 XML 文件;否则,转到编辑状态。
If Request.Form("btnSubmit") = "" Then
loadXMLFile server.MapPath("userdata.xml"),server.MapPath("userdata.xsl")
Else
updateXML server.MapPath("userdata.xml")
End If
%>
当表单提交成功后,我们用updateduserdata.xsl来显示我们刚刚编辑的数据。
updateduserdata.xsl如下:
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="' target=_blankhttp://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<body>
<h1>更新后的用户资料如下:</h1>
<table border="1" cellpadding="2">
<xsl:for-each select="用户资料/field">
<tr>
<td>
<xsl:value-of select="@id" />
</td>
<td>
<xsl:value-of select="field_value" />
</td>
</tr>
</xsl:for-each>
</table>
<form>
<input type="button" value="返回" onclick="history.go(-1)" />
</form>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
以上只是XML跨平台应用的一个简单的例子,结合具体的需求,我们可以编写功能更强大的程序来完成我们更负杂的工作。所有程序在WIN98SE+PWS+IE5.5+Netscape 4.75+Netscape 6+MSXML3.DLL环境下调试通过。
利用XSL和ASP检索和更新XML文件内容
[原作者:宇宙人]
利用XML文件存储数据,可以实现真正的跨平台,给我们的数据实现不同平台的转换带来很大的便利。本文的例子向您展示了如何对XML文件进行数据添加、删除、修改的操作。为了叙述的方便,有时也把本例中的每个人的“个人资料”叫作记录。
首先,我们列出XML文件的所有记录,然后,用服务器端的ASP程序和XSL样式单文件来把XML文件转换到HTML文件里,以便显示在任意浏览器里。
现在假定有一个客户资料文件Userdata.xml如下:
<?xml version="1.0" encoding="gb2312"?>
<客户资料表>
<个人资料>
<field id="姓名" taborder="1">
<field_value>张三</field_value>
</field>
<field id="性别" taborder="2">
<field_value>男性</field_value>
</field>
<field id="地址" taborder="3">
<field_value>北京市第999号信箱</field_value>
</field>
<field id="邮政编码" taborder="4">
<field_value>100000</field_value>
</field>
<field id="电话" taborder="5">
<field_value>86-10-88886666</field_value>
</field>
<field id="电子邮件" taborder="6">
<field_value>zhangsan@examdomain.com</field_value>
</field>
</个人资料>
<个人资料>
<field id="姓名" taborder="1">
<field_value>李四</field_value>
</field>
<field id="性别" taborder="2">
<field_value>女性</field_value>
</field>
<field id="地址" taborder="3">
<field_value>上海市黄浦区1208号黄浦大厦A座11层</field_value>
</field>
<field id="邮政编码" taborder="4">
<field_value>200200</field_value>
</field>
<field id="电话" taborder="5">
<field_value>86-21-66668888</field_value>
</field>
<field id="电子邮件" taborder="6">
<field_value>lisi@examdomain.com</field_value>
</field>
</个人资料>
<个人资料>
<field id="姓名" taborder="1">
<field_value>杨过</field_value>
</field>
<field id="性别" taborder="2">
<field_value>男性</field_value>
</field>
<field id="地址" taborder="3">
<field_value>神雕侠侣桃花岛</field_value>
</field>
<field id="邮政编码" taborder="4">
<field_value>888888</field_value>
</field>
<field id="电话" taborder="5">
<field_value>800-810-8080</field_value>
</field>
<field id="电子邮件" taborder="6">
<field_value>yangguo@examdomain.com</field_value>
</field>
</个人资料>
<个人资料>
<field id="姓名" taborder="1">
<field_value>小龙女</field_value>
</field>
<field id="性别" taborder="2">
<field_value>女</field_value>
</field>
<field id="地址" taborder="3">
<field_value>神雕侠侣之古慕派</field_value>
</field>
<field id="邮政编码" taborder="4">
<field_value>999999</field_value>
</field>
<field id="电话" taborder="5">
<field_value>800-810-9090</field_value>
</field>
<field id="电子邮件" taborder="6">
<field_value>xiaolongnv@examdomain.com</field_value>
</field>
</个人资料>
</客户资料表>
我们编写Userdata.xsl样式单文件如下:
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="' target=_blankhttp://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body bgcolor="#0099ff">
<h1>客户资料表</h1>
<table border="1" cellpadding="2">
<tr bgcolor="#ccccff">
<td align="center"><b>姓名</b></td>
<td align="center"><b>电子邮件</b></td>
</tr>
<xsl:for-each select="客户资料表/个人资料">
<tr>
<td>
<a><xsl:attribute name="href">Userdata.asp?mode=viewdetail&email=<xsl:value-of select="field[@id='电子邮件']/field_value"/></xsl:attribute><xsl:value-of select="field[@id='姓名']/field_value"/></a>
</td>
<td><xsl:value-of select="field[@id='电子邮件']/field_value"/></td>
</tr>
</xsl:for-each>
</table>
<br />
<a href="addnewdata.htm">增加新记录</a>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSL样式单文件遍历整个XML文件的内容,并借助HTML的table标记来显示它。这里允许浏览者可以通过点击客户姓名来查看该客户的详细资料,也可以添加新的客户信息。
下面,我们编写Userdata.asp程序来完成XML文件转换,数据的浏览、修改、删除:
<%
'-------------------------------------------------------------------
'删除记录函数deleteDetail
'参数说明:[程序详细说明请参照《利用ASP和XSL在线编辑XML文件》]
'链接地址:http://www.ccw.com.cn/htm/app/aprog/01_3_28_4.asp
'strXMLFile - 要载入的XML文件。
'strXSLFile - 显示XML文件的XSL样式单文件。
'strEMail - 要删除客户的电子邮件。
'-------------------------------------------------------------------
Function deleteDetail(strXMLFile, strXSLFile, strEMail)
Dim objDom
Dim objRoot
Dim objNode
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load strXMLFile
Set objRoot = objXML.documentElement
Set objNode = objRoot.SelectSingleNode("个人资料[field/field_value='" & strEMail & "']")
objRoot.removeChild(objNode)
objXML.save strXMLFile
loadXMLFile strXMLFile,strXSLFile
End Function
'-------------------------------------------------------------------
'更新记录函数updateDetail
'-------------------------------------------------------------------
Function updateDetail(strXMLFile, strXSLFile, strEMail)
'Declare local variables.
Dim objDom
Dim objRoot
Dim objContact
Dim objField
Dim strNewEMail
strNewEMail = Request.Form("电子邮件")
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load strXMLFile
Set objRoot = objXML.documentElement
Set objContact = objRoot.SelectSingleNode("个人资料[field/field_value='" & strEMail & "']")
For each objItem in Request.Form
Set objField = objContact.selectSingleNode("field[@id='" & objItem & "']/field_value")
objField.text = Request.Form(objItem)
Next
objXML.save strXMLFile
viewDetail strXMLFile, strXSLFile, strNewEMail
End Function
'-------------------------------------------------------------------
'显示个人详细资料函数viewDetail
'-------------------------------------------------------------------
Function viewDetail(strXMLFile, strXSLFile, strEMail)
Dim objXML
Dim objNode
Dim objXSL
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load(strXMLFile)
Set objNode = objXML.SelectSingleNode("客户资料表/个人资料[field/field_value='" & strEMail & "']")
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
objXSL.async = false
objXSL.load(strXSLFile)
Response.Write(objNode.transformNode(objXSL))
End Function
'-------------------------------------------------------------------
'显示所有信息函数loadXMLFile
'-------------------------------------------------------------------
Function loadXMLFile(strXMLFile, strXSLFile)
Dim objXML
Dim objXSL
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.load(strXMLFile)
set objXSL = Server.CreateObject("Microsoft.XMLDOM")
objXSL.async = false
objXSL.load(strXSLFile)
Response.Write(objXML.transformNode(objXSL))
End Function
Dim strMode
Dim strEMail
strMode = Request.QueryString("mode")
strEMail = Request.QueryString("email")
Select Case strMode
Case "viewdetail"
viewDetail server.MapPath("Userdata.xml"), server.MapPath("viewdetail.xsl"), strEMail
Case "editdetail"
viewDetail server.MapPath("Userdata.xml"), server.MapPath("editdetail.xsl"), strEMail
Case "updatedetail"
updateDetail server.MapPath("Userdata.xml"), server.MapPath("viewdetail.xsl"), strEMail
Case "deletedetail"
deleteDetail server.MapPath("Userdata.xml"), server.MapPath("Userdata.xsl"), strEMail
Case Else
loadXMLFile server.MapPath("Userdata.xml"), server.MapPath("Userdata.xsl")
End Select
%>
我们可以利用下面的文件来完成新客户信息的输入,文件addnewdata.htm如下:
<html><head><title>客户信息输入</title></head>
<body bgcolor="#0099ff">
<form action="processAdd.asp" method="post">
<h3>请输入您的客户信息</h3>
姓名: <input type="text" id="姓名" name="姓名">
性别: <input type="text" id="性别" name="性别">
地址: <input type="text" id="地址" name="地址">
邮政编码: <input type="text" id="邮政编码" name="邮政编码">
电话: <input type="text" id="电话" name="电话">
电子邮件: <input type="text" id="电子邮件" name="电子邮件">
<input type="submit" id="btnSub" name="btnSub" value="填好了,发送">
</form>
</body>
</html>
当填写完上面的表单后,提交到数据处理程序processAdd.asp,本程序可以判断Userdata.xml文件是否存在,如果不存在,就建立新文件;否则把提交的数据添加到Userdata.xml中。然后根据提交成功与否,显示数据保存成功与失败。processAdd.asp程序如下:
<%
'--------------------------------------------------------------------
'添加数据的函数addNewdatatoXML
'--------------------------------------------------------------------
Function addNewdatatoXML(strFileName)
Dim objDom
Dim objRoot
Dim objRecord
Dim objField
Dim objFieldvalue
Dim objattID
Dim objattTabOrder
Dim objPI
Dim blnFileExists
Dim x
Set objDom = server.CreateObject("Microsoft.XMLDOM")
objDom.preserveWhiteSpace = True
blnFileExists = objDom.Load(strFileName)
If blnFileExists = True Then
Set objRoot = objDom.documentElement
Else
Set objRoot = objDom.createElement("客户资料表")
objDom.appendChild objRoot
End If
Set objRecord = objDom.createElement("个人资料")
objRoot.appendChild objRecord
For x = 1 To Request.Form.Count
If instr(1,Request.Form.Key(x),"btn") = 0 Then
Set objField = objDom.createElement("field")
Set objattID = objDom.createAttribute("id")
objattID.Text = Request.Form.Key(x)
objField.setAttributeNode objattID
Set objattTabOrder = objDom.createAttribute("taborder")
objattTabOrder.Text = x
objField.setAttributeNode objattTabOrder
Set objFieldvalue = objDom.createElement("field_value")
objFieldvalue.Text = Request.Form(x)
objRecord.appendChild objField
objField.appendChild objFieldvalue
End If
Next
If blnFileExists = False then
Set objPI = objDom.createProcessingInstruction("xml", "version='1.0' encoding='gb2312'")
objDom.insertBefore objPI, objDom.childNodes(0)
End If
objDom.save strFileName
Set objDom = Nothing
Set objRoot = Nothing
Set objRecord = Nothing
Set objField = Nothing
Set objFieldvalue = Nothing
Set objattID = Nothing
Set objattTabOrder = Nothing
Set objPI = Nothing
End Function
On Error Resume Next
addNewdatatoXML server.MapPath("Userdata.xml")
If err.number <> 0 then
Response.write("<html><body bgcolor='#0099ff'><center><font color=red><b>您提交的表单没有成功保存,请重新提交!!</b>
<a href='javascript:history.go(-1)'>点击这里重新进行提交。</a></body></html>")
Else
Response.write("<html><body bgcolor='#0099ff'><center><font color=red><b>您提交的表单已经成功保存!!!</b>
<a href='Userdata.asp'>点击这里查看添加后客户资料表</a></body></html>")
End If
%>
至此,我们完成对XML文件进行数据添加、浏览、修改、删除的所有工作。当然,也可以根据需要,对所有记录进行排序输出,只需采用XSL:for-each元素的order-by属性即可。以上所有程序在PWS+IE5.5和Netscape下调试通过。
快速通过XSL转换XML文件
[原作者:小柜子]
XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表。
排版样式表分:CSS和XSL。其中XSL非常适合XML。(在这里不讨论CSS!)
现在开始转换吧!
XSL包含两大部分:XSLT和XSL Formatting Object
XSLT(XSLTransformations)一种用来转换XML文件的语言。
XSL Formatting Object:一组用来格式化(排版)语意的词汇。
第一步:转换
XSL处理器首先要做的是通过分析器(DOM或SAX)技术读取XML标记及数据。
DOM(Document Object Model)文件对象模型。(XML应用上常利用DOM技术来访问XML数据文件。)
当浏览器通过XML DOM对象读取到XML的树状结构与数据后,将XML树状结构重新排行组合后产生一个暂时的数状结构,这个树状结构称为结果树。
在这个结果树产生后,若又出现了新的标记或数据,必须把它一起并入结果树。
第二步:格式化转换
结果树也是树状结构,可以利用DOM技术访问结果树的数据,数据以节点方式显示,并且预留一个记录样式的位置。
XSL处理其中的程序将这些数据转换(格式化)为另一种Well-Formed XML文件(如:WML、HTML、VoiceXML等)。