学院首页>网页制作>XML>我的 XML,您的浏览器

我的 XML,您的浏览器

作者:Charlie Heinemann 来源:中国动感技术网络 添加时间:2006-5-21 9:53:08
下列文章源自 Site Builder Network Magazine "Extreme XML" 专栏 (现在是 MSDN Online Voices Extreme XML)。 

  就在感恩节期间的某个时间里,我快速地完成一个网路上的排程应用程式, 它使用了 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 团队的程式设计经理。他来自德州,知道如何思考大格局。
站内搜索