admin管理员组

文章数量:1566678

2024年7月22日发(作者:)

在Domino中利用XSL和XML输出格式数据列表

关键字:Domino、XSL、XML、数据列表

概述

在Domino环境中输出视图文档列表的有很多种方法,比如有嵌入视图方法、有XML方法、

有利用视图的HTML属性方法,以上这些方法只能用固定的一种样式显示视图数据,如果对

于同一数据可按照不同样式进行输出需要考虑使用其他方式,这里介绍的就是利用XSL+

XML技术完全在客户端利用Javascript语言来实现多样式数据的展示,实现系统的分页等

功能。

XSL介绍

---XML的样式表

HTML网页使用预先确定的标识(tags),这就是说所有的标记都有明确的含义,例如

另起一行

是标题字体。所有的浏览器都知道如何解析和显示HTML网页。

然而,XML没有固定的标识,我们可以建立我们自己需要的标识,所以浏览器不能自动解

析它们,例如

可以理解为表格,也可以理解为桌子。由于XML的可扩展性,使我

们没有一个标准的办法来显示XML文档。

为了控制XML文档的显示,我们有必要建立一种机制,CSS就是其中的一种,但是

XSL(eXtensible Stylesheet Language)是显示XML文档的首选样式语言,它比CSS更适

合于XML。

--- 不仅仅是一种样式表

XSL由两部分组成:

一是转化XML文档;二是格式化XML文档。

XSL是一种可以将XML转化成HTML的语言,一种可以过滤和选择XML数据的语言,一种

能够格式化XML数据的语言。

--- 它能做什么?

XSL可以被用来定义XML文档如何显示,可以将XML文档转换成能被浏览器识别的HTML

文件,通常的,XSL是通过将每一个XML元素"翻译"为HTML元素,来实现这种转换的。

XSL能够向输出文件里添加新的元素,或则移动元素。XSL也能够重新排列或者索引数据,

它可以检测并决定哪些元素被显示,显示多少。

在Domino中XSL的实现方案

在Domino环境中需要利用视图的readviewentries的URL方法访问视图用来返回XML

格式数据,然后利用实现准备好的XSL文件来格式化返回的XML数据,最后利用XSL的转换

格式功能,把XML格式数据转换成HTML数据用来显示最终数据列表。

在使用XSL格式XML数据时系统可以提供基于客户端的解决方式,也可以提供基于服务器端

的解决方式,根据浏览器版本以及类型的不同,我们这里选用基于客户端的解决方式实现。

1. JavaScript解决方案

一个更好的更全面的解决方案是使用Javascript来实现XML到HTML的转换。但是使用

JavaScript必须得到以下功能支持:

a.允许Javascript代替浏览器进行细节检测;

b.根据不同的需要和不同的浏览器使用不同的样式表。

对于XSL来说这是完全可行的。设计XSL的目标之一就是允许将一种格式转换成另一种

格式,支持不同的浏览器,支持不同的用户需求。未来的浏览器的重要任务就是在客户

端执行XSL的转换工作。

2. 基于客户端的XSL实现逻辑处理结构图

浏览器

客户端

分析XML

分析XSL

转换HTML

JavaScript

发送Http请求

返回视图XML数据

Domino服务器端

视图

发送Http请求

返回XSL数据

XSL资源文件

系统实现逻辑结构图说明

1首先在客户端由用户发起显示数据列表的请求,请求有2个,一个用于要请求的

Domino视图数据,以XML方式进行请求;另外一个是装载XSL文件的请求

2请求发起后Domino服务器端负责给客户端返回数据,分别返回Domino视图的XML

数据和XSL文件的XML格式数据给客户端

3客户端接收到以上XML视图数据和XSL文件的XML数据后开始进行解析

4客户端首先解析XML视图数据,包括视图是否是分类视图、视图中各个列的宽度、

视图中是否包含数据、视图中的分页信息等

5解析完XML视图数据后,开始解析XSL文件的XML数据,在解析过程中使用XSL样

式表进行格式化XML视图数据

6完成以上所有解析后最后通过XSL的转换功能把最终的XML数据转换成HTML数据

在客户端进行显示,完成数据展示。

实现细节

1. 首先定义XSL文件

XSL文件也是符合XML标准的XML文件,在该文件中通过XSL元素语言描述了如何解析

XML格式数据,在这里的样式表用的是传统的CSS文件。

本案例中的XSL文件格式如下,文件编写完成后可以放在当前NSF数据库中,也可以放

在HTML目录下,只要能够被Domino服务器的HTTP服务器请求到就可以,这里我们以

放在当前数据库中为例进行说明。

XSL文件内容如下:

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

xmlns:myNS="urn:myNameSpace">

onmouseover=" = 'hand'"

onmouseout=" = 'hand'"

align="center" class='VwTtr'>

select="@width" />

center

VwTtd

onmouseout="resumemenu()" class="VwCtr">

选中

select="text" />

COLOR="6D0202">目前无任何信息!

./0/

/>?opendocument

checkbox

$$SelectDoc

select="@unid"/>

编写完成后存成文件扩展名为xsl类型的文件,然后在数据库资源文件中引入该文件。

注意地方:

1. 1首先在XSL文件中声明字符编码

1.2 指定XSL文件的版本号以及所引用的XSL标准,如果没有此句,XSL文件不能被正

常解析。

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

xmlns:myNS="urn:myNameSpace">

2. 解析XML视图数据

在Domino的Script库中定义解析XML视图数据和XSL数据的代码,最后通过XSL

的转换功能,把XML格式数据转换成HTML格式数据进行最终显示。

这里把主要代码整理出来,供参考。

var HTMLresults; //表单中以xml方式显示的数据库内容

var source; //由视图转化的xml文件

var style; //xsl文件,数据显示时应用的具体样式文件

var sortColumn; //排序列

var rowsnum //每页显示的行数,可以通过表单rowsval域自定义

var startnum=1 //视图搜索起始数目

var viewname //当前视图的名称

var pagenum //当前类别文档总页数

var catField //类别选择框seloption对象

var totaldoc //显示当前类别文档总数

var optiontext //类别选择框seloption的选项text值

var optionval //类别选择框seloption的选项value值

var htmlstr //条目统计文本

var pagestathtml //页数统计文本

var colwidthval //列的显示宽度,由colwidth确定

var tableheadtext //当文档为空时表头显示文本,由tablehead确定

var typelen //类别总数标志

var typetext //当前类别

//视图表单的装载

//装载文档,确定显示格式

function loadXML() {

//取得各相关显示数据

catField = [0].seloption

viewname=

colwidthval=(",")

tableheadtext=(",")

rowsnum=

typestr=

typelenstr=

source = new ActiveXObject("");

style = new ActiveXObject("");

ystatechange=stateChangeHandler //输出装载状态

= false;

= false;

teOnParse = false;

eExternals = false;

veWhiteSpace = false;

typelen=0

setpath=""

if ((typestr!=""&&typelenstr=="0")||(typestr==""&&typelenstr=="0"))

{

if (typestr ==""&&typelenstr=="0")

tmpstr="./"+viewname+"?ReadViewEntries&CollapseView"

if (typestr!=""&&typelenstr=="0")

tmpstr="./"+viewname+"?ReadViewEntries&RestrictToCategory="+typestr

(tmpstr);

if(getReadyState()){

(setpath);

if(ode != 0) {

showError();

}

else{

if

(!mentsByTagName("viewentries")[0].attributes[0]){

element=Attribute("toplevelentries")

=0

mentsByTagName("viewentries")[0].edItem(el

ement)

}

mentsByTagName("viewentries")[0].attributes[0].text=0

element=Element("viewentry");

mentsByTagName("viewentries")[0].appendChild(element);

for(var n=0;n<;n++){

element=Element("entrydata");

mentsByTagName("viewentry")[0].appendChild(element);

element=Attribute("columnnumber")

=n

mentsByTagName("entrydata")[n].edItem(elem

ent)

element=Attribute("name")

=tableheadtext[n]

mentsByTagName("entrydata")[n].edItem(elem

ent)

element=Element("text");

=""

mentsByTagName("entrydata")[n].appendChild(element);

}

//添加列显示宽度

for(var t=0;t<;t++){

var element_attr=Attribute("width")

element_=colwidthval[t]

if(mentsByTagName("viewentry")[0].(t)){

mentsByTagName("viewentry")[0].(t).attribute

edItem(element_attr)

}

}

}

}

}

//typestr!=""&&typelenstr!="0"为单一分类且有文档的情况或有分类列表

且有文档或无分类列表且有文档的情况

if((typestr!=""&&typelenstr!="0")||(typestr==""&&typelenstr!="0")){

typelen=1

if(typeof(catField)!="undefined"){

//有分类列表且有文档的情况

typename=("###")

eachtypelen=("###")

tmpstr="./"+viewname+"?ReadViewEntries&start="+startnum+"&count="+rowsn

um+"&RestrictToCategory="+typetext

}

else{

for(var i=0;i<;i++){ //生成下拉列表

optiontext=typename[i] //取得类别名称

optionval=eachtypelen[i]//取得该类别文档总数

var newOpt = new Option(optiontext, optionval, false, true)

s[] = newOpt;

}

s[0].selected=true

typetext=s[0].text

totaldoc=s[0].value

typetext=typestr

totaldoc=typelenstr

if(typetext==""){

tmpstr="./"+viewname+"?ReadViewEntries&start="+startnum+"&count="+rowsnu

m

}

else{

tmpstr="./"+viewname+"?ReadViewEntries&start="+startnum+"&count="+rowsnu

m+"&RestrictToCategory="+typetext

(tmpstr);

if(getReadyState()){

(setpath);

if(ode != 0) {

}

else{

//不为0时,统计条及搜索条显示。统计条及搜索条缺省隐藏

//if(mentsByName("ss")[0]){

showError();

}

}

//mentsByName("ss")[0].y=""

//}

if(mentsByName("tab1")[0]){

mentsByName("tab1")[0].y=""

}

//添加列显示宽度

for(var t=0;t<;t++){

var element_attr=Attribute("width")

element_=colwidthval[t]

if(mentsByTagName("viewentry")[0].(t)){

mentsByTagName("viewentry")[0].(t).attribute

edItem(element_attr)

}

//将文档数目、页数统计条初始化

pagenum=parseInt(totaldoc)/parseInt(rowsnum)

if(pagenum>parseInt(pagenum)){

pagenum=parseInt(pagenum)+1

}

else{

}

pagenum=parseInt(pagenum)

}

pagestathtml="共"+pagenum+"页,当前显示第1页,

"

if(("pagestat")){

("pagestat").innerHTML=pagestathtml

}

if(parseInt(totaldoc)

htmlstr="共找到"+totaldoc+"条文档,当前显示

1-"+totaldoc+"条"

}

else{

htmlstr="共找到"+totaldoc+"条文档,当前显示

1-"+rowsnum+"条"

}

}

}

if(("totalstat")){

("totalstat").innerHTML=htmlstr

}

}

doTransform();

}

//将xml文件格式转化为html格式,并输出到表单的HTMLresults中

function doTransform() {

if (getReadyState()){

}

注意地方:

2.1 把XML数据转换成HTML格式数据方法:doTransForm()中的

ormNode(style).

resulting = ormNode(style);

}

系统环境

1. Lotus Domino6.5

2. IE6.0以上

本文标签: 数据视图显示文件文档