我的 XML,您的浏览器
作者:Charlie Heinemann 来源:中国动感技术网络 添加时间:2006-5-21 9:53:08就在感恩节期间的某个时间里,我快速地完成一个网路上的排程应用程式, 它使用了 Internet Explorer 5 里面的
新 XML 功能。我非常自豪地拿起电话连络一位同事,并要求他上网看一看。他对於我在这种时刻叨扰有一点儿不悦, 但
仍然迁就我,并且看了一下我的新网站。他并没有太大地惊讶。
我呆愕地坐了数秒钟,而後才理解为什麽他不像我一样地兴奋:他家里的机器不是使用 Internet Explorer 5。有了这个
领悟,我挂断电话,开始着力於发展网站新版本,使它对其它浏览器更有亲和力。
告诉您我做了些什麽,我会解释一张未出现在我同事的浏览器中的特别网页。这张网页十分简单。它下载了一个 XML 档案
以及 一张 XSL 样式表,将它们放在一起,然後显示所产生的 HTML 结果。 这个 XML 档案包含某天的会议基本资讯:
<schedule date="1/22/99">
<meeting>
<start-time>09:00</start-time>
<end-time>10:30</end-time>
<location>1020/3</location>
<attendees>
<attendee>
<name>John Jackson</name>
<email>johnJa</email>
</attendee>
<attendee>
<name>Regina Caplan</name>
<email>regCap</email>
</attendee>
</attendees>
<subject>HeffHousen deal</subject>
</meeting>
<meeting>
<start-time>16:30</start-time>
<end-time>18:00</end-time>
<location>1020/3</location>
<attendees>
<attendee>
<name>Calvin Richards</name>
<email>calvinr</email>
</attendee>
<attendee>
<name>John Jackson</name>
<email>johnJa</email>
</attendee>
<attendee>
<name>Regina Caplan</name>
<email>regCap</email>
</attendee>
</attendees>
<subject>How the Heff Housen deal
fits into our general strategy</subject>
</meeting>
<meeting>
<start-time>13:00</start-time>
<end-time>16:00</end-time>
<location>1037/3</location>
<attendees>
<attendee>
<name>Calvin Richards</name>
<email>calvinr</email>
</attendee>
</attendees>
<subject>General strategy</subject>
</meeting>
</schedule>
使用 「排序依据」 属性,XSL 样式单依据时间来排序这些会议节点。然後它会照指示显示会议节点内的资讯。
「xsl:for-each」 元素是用来确定每一个会议节点已经处理,以及每个会议的各个与会者节点也已经处理:
<HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<BODY STYLE="font-family:Arial, helvetica,
sans-serif; font-size:12pt;
background-color:#EEEEEE">
<DIV STYLE="font-weight:bold;font-size=16pt">
<xsl:value-of select="@date"/>
</DIV>
<xsl:for-each select="meeting" order-by="+ start-time">
<DIV STYLE="background-color:#8B0000;
color:#FFFFFF; padding:4px">
<SPAN STYLE="font-weight:bold; color:white">
<xsl:value-of select="start-time"/>
- <xsl:value-of select="end-time"/>
Subject: <xsl:value-of select="subject"/></SPAN>
</DIV>
<DIV STYLE="font-weight:bold">LOCATION:
<xsl:value-of select="location"/>
</DIV>
<DIV STYLE="font-weight:bold">ATTENDEES: </DIV>
<xsl:for-each select="./attendees/attendee">
<DIV STYLE="text-indent:1cm">
<xsl:value-of select="name"/>
</DIV>
</xsl:for-each>
</xsl:for-each>
</BODY>
</HTML>
在原始页面中,我根据 XSL 样式表使用了下列 HTML 来显示 XML:
<HTML>
<BODY>
<XML ID="XMLDoc"></XML>
<XML ID="XSLDoc"></XML>
<DIV ID="insertHTML"></DIV>
<SCRIPT LANGUAGE=VBScript>
XMLDoc.async = false
XMLDoc.load("schedule.xml")
XSLDoc.async = false
XSLDoc.load("schedule.xsl")
result = XMLDoc.documentElement.transformNode
(XSLDoc.documentElement)
insertHTML.innerHTML = result
</SCRIPT>
</BODY>
</HTML>
这是在您是执行 Internet Explorer 5 的情况。如果不是 -- 就像我同事 -- 则您会看到一则错误的讯息,因为浏览器没
有适当的 XML 支援。 我可以将资料强制编码成为 HTML 档案来解决这些问题。然而,接着我可能必须同时维护 XML 和
HTML 档案。下面方式应该会更好,如果是在那些不是使用 Internet Explorer 5 的用户端的情况下,我可以用动态方式
在伺服器上建立适当的 HTML,然後只下传该档。所以我就这样做了。
救援的 ASP 技术
首先,我为 HTML 档做了一个 ASP 档,然後写了一个小指令档用以查探用户端使用的是否为 Internet Explorer 5 :
<%@Language=VBScript%>
<%
client = Request.ServerVariables("HTTP_USER_AGENT")
version = Split(client,";",-1,1)
在 HTTP 标题内用户端所传送的是变数 HTTP_USER_AGENT。 这个变数包含用户端的相关资讯,如它的类型和版本。因为我
的机器使用 Internet Explorer 5, HTTP_USER_AGENT 变数是设定成 「Mozilla/4.0 (compatible; MSIE 5.0b2;
Windows NT;ITG-IE401SP1)」。 浏览器的版本是陈述在 「compatible;」 之後的文字。因此,我在 Visual Basic
Scripting Edition (VBScript) 中使用了 Split 功能来分析出字串和撷取提供浏览器资讯的文字。
在这个特定的范例中,我想要看看浏览器是否为 Internet Explorer 5。如果是,我会允许用户端下载,并处理 XML 和
XSL 档案。如果不是,我会在伺服器上处理,然後将结果以 HTML 字串下传到用户端:
IF version(1) = " MSIE 5.0b2" Then%>
<HTML>
<BODY>
<XML ID="XMLDoc"></XML>
<XML ID="XSLDoc"></XML>
<DIV ID="insertHTML"></DIV>
<SCRIPT LANGUAGE=VBScript>
XMLDoc.async = false
XMLDoc.load("schedule.xml")
XSLDoc.async = false
XSLDoc.load("schedule.xsl")
result =
XMLDoc.documentElement.transformNode
(XSLDoc.documentElement)
insertHTML.innerHTML = result
</SCRIPT>
</BODY>
</HTML>
<%
Else
Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM")
Set XSLDoc = Server.CreateObject("Microsoft.XMLDOM")
XMLDoc.async = false
XMLDoc.load(Server.MapPath("schedule.xml"))
XSLDoc.async = false
XSLDoc.load(Server.MapPath("schedule.xsl"))
response.write(XMLDoc.documentElement.transformNode
(XSLDoc.documentElement))
End IF
%>
上述的 ASP 档案有两种用途。第一,它可让我显示我的 XML,并且让不是执行 Internet Explorer 5 的浏览器可以检视
该资料。第二, 它可让那些执行 Internet Explorer 5 的用户端下载并自行处理 XML 和 XSL。这对伺服器来说很有助
益,因为它可以释出珍贵的伺服器资源。这对用户端的帮助也很大,因为它可让用户端快取 XML 及 XSL。结果是,在其它
地方重覆使用 XML 和 XSL 时,不必从伺服器重新载入资料。
亦节省时间
本机的资料快取处理可以节省相当多的时间,尤其是当相同资料的呈现在多重检视的时候。例如,假设我们要的是上述排
程的精简版本 -- 也就是说,只要会议时间和主旨。对於不是使用 Internet Explorer 5 的用户端而言,我们将必须在伺
服器 上处理每一个检视。也就是每一次都要载入 XML 和 XSL。然而, 对使用 Internet Explorer 5 的用户端而言,我
们只要在用户端上套用不同的 XSL 样式单即可。我们仍然需要时间来载入 XSL, 但我们不必重新载入 XML。
Charlie Heinemann 是 Microsoft's Weblications 团队的程式设计经理。他来自德州,知道如何思考大格局。
站内搜索