通过向xsl传递参数+数据岛方式,实现在客户端单个xml的分框架显示。
  对于数据较少的xml数据,可以使用一次下载完所有数据,将显示全部放到客户端完成,下面例子中,将一个xml文件显示为左右两个框架,左边显示条目,右边显示内容。可以在本地,不用通过服务器解释. 
  关键:使用msxml的dom对象向xsl模板传递参数
  环境: ie6 + msxml3.0
  examples:
  /*** book.xml ***/
<?xml version="1.0" encoding="gb2312" ?> 
<?xml-stylesheet type="text/xsl" href="book.xsl"?> 
<moonpiazza> 
 <book id="1"> 
      <书名>基于xml 的 asp.net开发</书名> 
   <定价>42</定价> 
      <作者>dan wahlin/王宝良</作者> 
 </book> 
 <book id="2"> 
      <书名>xml应用的uml建模技术</书名> 
      <定价>32</定价> 
      <作者>david carlson/周靖 侯奕萌 沈金河等</作者> 
 </book> 
 <book id="3"> 
      <书名>极限编程研究</书名> 
      <定价>70</定价> 
      <作者>giancarrio succi/michele marchesi/张辉(译)</作者> 
 </book> 
 <book id="4"> 
      <书名>design patterns</书名> 
      <定价>38</定价> 
      <作者>erich gamma/richard helm/ralph johnson/john vlissides</作者> 
 </book> 
</moonpiazza>
  /*** book.xsl ***/
<?xml version="1.0" encoding="gb2312"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 
<xsl:template match="/"> 
<html> 
<head> 
<script language="javascript"> 
<xsl:comment> 
<![cdata[ 
var m_oxsl ;  
var m_sframeattr_left, m_sframeattr_main ; 
var m_sxmlfile, m_sxsltfile ; 
m_sxmlfile = "" ; 
m_sxsltfile = "book_view.xsl"; // 指定xsl文件 
function window.onload() 
{ 
 var oxsldoc ;  
 m_sframename_left = "left_frame";  
 m_sframename_main = "main_frame"; 
 m_oxsl = new activexobject("msxml2.xsltemplate.3.0"); 
 oxsldoc = new activexobject("msxml2.freethreadeddomdocument.3.0"); 
 oxsldoc.async = false; 
 oxsldoc.load(m_sxsltfile); 
 m_oxsl.stylesheet= oxsldoc; 
 initpage() ; 
} 
function initpage() 
{ 
 content.cols = "270,*" ; 
 viewframe(m_sframename_left); 
 var  shtmlstr = "请选择书目..."; 
 eval(m_sframename_main + ".document").open ("text/html","gb2312"); 
 eval(m_sframename_main + ".document").write(shtmlstr) ;   
} 
function viewframe(p_sframename) 
{ 
 var oxslproc; 
 var shtmlstr; 
 oxslproc  = m_oxsl.createprocessor(); 
 oxslproc.input = xmldata; 
 // 指定参数,显示左(或右)框架 
 oxslproc.addparameter("framename_left", m_sframename_left); 
 oxslproc.addparameter("framename_main", m_sframename_main); 
 oxslproc.addparameter("framename", p_sframename); 
 oxslproc.transform(); 
 shtmlstr = oxslproc.output ; // 获得转化后的字符串 
 eval(p_sframename + ".document").open ("text/html","gb2312"); 
 eval(p_sframename + ".document").write(shtmlstr) ; 
} 
function viewdata(p_sdataid) 
{ 
 var oxslproc; 
 var shtmlstr; 
 oxslproc  = m_oxsl.createprocessor(); 
 oxslproc.input = xmldata; 
  
 // 指定参数,显示id为 p_sdataid 的数据 
 oxslproc.addparameter("framename_left", m_sframename_left); 
 oxslproc.addparameter("framename_main", m_sframename_main); 
 oxslproc.addparameter("framename", m_sframename_main); 
 oxslproc.addparameter("dataid", p_sdataid); 
 oxslproc.transform(); 
 shtmlstr = oxslproc.output ; // 获得转化后的字符串 
 eval(m_sframename_main + ".document").open ("text/html","gb2312"); 
 eval(m_sframename_main + ".document").write(shtmlstr) ; 
} 
]]>  
</xsl:comment> 
</script> 
</head> 
<xml id="xmldata"> 
 <xsl:copy-of select="*"  /> 
</xml> 
<frameset cols="0,*" name="content"> 
 <frame name="left_frame" src="about:blank" /> 
 <frame name="main_frame"  src="about:blank" /> 
</frameset> 
</html> 
</xsl:template> 
</xsl:stylesheet>  
/*** book_view.xsl ***/ 
<?xml version="1.0" encoding="gb2312"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> 
<xsl:param name="framename_left" select="'left_frame_null'" /> 
<xsl:param name="framename_main" select="'main_frame_null'" /> 
<xsl:param name="framename" select="''" /> 
<xsl:param name="dataid" select="''" /> 
<xsl:template match="/"> 
<html> 
<head> 
<style type="text/css"> 
body 
{ 
 font-size:9pt; 
} 
td 
{ 
 font-size:9pt; 
} 
a{ 
 font-size:9pt; 
} 
</style> 
</head> 
 <xsl:choose> 
  <xsl:when test="$framename = $framename_left"> 
   <xsl:call-template name="left_frame" />  
  </xsl:when> 
  <xsl:when test="$framename = $framename_main"> 
   <xsl:call-template name="main_frame" />  
  </xsl:when> 
 </xsl:choose> 
</html> 
</xsl:template> 
<xsl:template name="left_frame"> 
 <xsl:for-each select="moonpiazza/book"> 
  <xsl:element name="a"> 
   <xsl:attribute name="href"> 
    javascript:parent.viewdata(<xsl:value-of select="@id" />); 
   </xsl:attribute> 
   <xsl:value-of select="书名" /> 
  </xsl:element> 
   
  <br/> 
 </xsl:for-each> 
</xsl:template> 
<xsl:template name="main_frame"> 
<xsl:choose> 
 <xsl:when test="$dataid != ''"> 
  <table border="1" width="500"> 
   <xsl:for-each select="moonpiazza/book[@id = $dataid]/*"> 
    <tr> 
     <td width="70"><xsl:value-of select="name()" /></td> 
     <td><xsl:value-of select="." /></td> 
    </tr> 
   </xsl:for-each> 
  </table>   
 </xsl:when> 
</xsl:choose> 
</xsl:template> 
</xsl:stylesheet>