xml应用(2): 通过向xsl传递参数+数据岛方式,实现在客户端单个xml的分框架显示

原创 2003年06月18日 09:16:00

对于数据较少的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>
 


:_)

XML 数据岛

With Internet Explorer, the unofficial tag can be used to create an XML data island.通过IE浏览器,非正式的标记可...
  • phqm
  • phqm
  • 2008年03月21日 15:36
  • 1463

XML 数据岛实例

HTML中的数据岛中的记录集 HT
  • tashanhongye
  • tashanhongye
  • 2015年10月27日 19:48
  • 781

XML 数据岛之二数据分页显示

我们已经知道如何使用HTML将XML数据岛中数据以Table形式显示出来,但是如果在数据比较多的时候,我们希望可以将数据分页显示,以避免用户上下翻屏。 熟悉HTML的朋友都知道标记中有一个dataPa...
  • chris_mao
  • chris_mao
  • 2007年10月15日 11:47
  • 1555

利用XSL双向转换XML文档

在实际应用中,经常要用到XML文件来存储相关的信息.而XML文件可以有三种结构:1:层次结构.DBTableName>  TableInfo>    Name>SZYLTJName>    Type>...
  • erqie
  • erqie
  • 2006年12月07日 14:59
  • 1303

xml/xsl(1):简单使用XSL显示XML样例

test1.xml tangsheng wukong bajie sasheng bailong test1.xsl De...
  • oldmtn
  • oldmtn
  • 2014年04月28日 11:03
  • 2149

xml+xsl转换为html

项目需要,需要使用xml+xsl转换为html文件存储。 以前也没做过这样的功能,上网搜索到的结果基本上xml和xsl都是以文件的形式保存和输入的,但我这里已经是拿到字符串了,所以考虑是否能直接使用...
  • wts
  • wts
  • 2014年12月30日 11:06
  • 1476

Chrome中的Xsl格式xml无法显示问题

原文:http://www.cnblogs.com/yudy/archive/2012/04/27/2473641.html 今天测试xsl格式化xml,结果在chrome中始终无法显示,换了火...
  • luoww1
  • luoww1
  • 2015年08月26日 17:12
  • 1107

xml与xsl的转换

xml文档的一大特点是可以向多种格式的文档进行转换。比如,从一种逻辑结构的xml向另一种逻辑结构的xml转换,或是转换为可浏览的html文档等。这种xml文档的数据格式转换功能由可扩展样式单语言(xs...
  • lvyuan30276
  • lvyuan30276
  • 2016年01月05日 23:28
  • 1356

Chrome无法用xsl显示xml文档

今天在做一个xml的小试验时,发现Chrome竟然无法显示经过xsl修饰的文档!!这么高级的浏览器不应该存在这样的情况啊。经过一翻折腾加google后,发现确实是因为Chrome太高级了所以无法显示:...
  • jnuyanfa
  • jnuyanfa
  • 2016年04月25日 22:43
  • 1653

jaxb jaxp使用xml来生成动态页面 - xml xsd xsl ( xpath xslt ) css 概念入门

问题:公司里面的一个项目需要建立一个Test Benchmark 来比较不同算法计算的mileage需求定义:只有少量的操作(页面)结构化的数据(TestCase, TestResult)选择使用XM...
  • FireCoder
  • FireCoder
  • 2010年08月12日 17:32
  • 3437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:xml应用(2): 通过向xsl传递参数+数据岛方式,实现在客户端单个xml的分框架显示
举报原因:
原因补充:

(最多只允许输入30个字)