博文
XML技术系列讲座(4)XML的显示—XSL样式单(下)(2006-04-30 13:03:00)
摘要:本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-07 07:15:01)
一、XSL模板的使用
XSL在输出模板中描述输出格式,这些格式可以是各种字符串、标签符号、节点值或者是一些XSL语法结构,如条件判断、循环处理等。在许多应用场合中,输出模板中需要使用节点的取值,此时可以根据需要使用元素输出节点值,最直接的使用方式是,这样可以输出当前节点及其所有后继节点的取值。而如果仅仅是想输出指定节点的取值,可以利用select属性进行限定(select属性可以是任意合法的路径表达式):
上述第一个表达式匹配的对象是当前节点的所有子节点中名称为的元素,第二个表达式匹配的对象则是当前节点中所有后继节点中名为的元素。注意: 在XSL样式单中必须有一个模板规则与根元素相匹配。
在确定了模板规则与元素相匹配之后,就可以激活模板,这项任务由元素完成。它和元素相结合就如同编程中的函数调用:前者是调用指令,而后者就是函数体。对于不同的元素需要调用不同的模板进行处理。为了激活样式单中的模板规则,要在根元素模板规则中使用元素,这样就会层层作用使整个样式单文件生效:
直接使用元素表示不加区分地对当前节点的所有子节点应用模板,而在select属性中书写匹配式则能够限定作用对象:
上述第一个模板与XML文档的根元素相匹配,并对根节点以下的所有元素应用模板规则。然后,一旦遇到标签,就插入一个
标签作为空白段落,接着对元素和元素分别应用模板规则。最后,经过转换显示的结果是36磅字体的职员名字和用斜体字表示的职员薪水。
二、XSL的扩展规则
1. 路径指示符
除了前面介绍的“//”和“/”路径指示符,以及统配符“*”,还有几个符号可以用来对模板的匹配对象进行限制:
● 当前节点指示符为“.”;
......
XML技术系列讲座(3)XML的显示——XSL样式单(上)(2006-04-30 13:01:00)
摘要:本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-07 06:15:00)
一、XML文档转换原理
数据格式转换的重要思想是要把XML文档视为一种树结构,转换的过程就是从源树生成结果树的过程。XSL样式单定义了源树和结果树中对应部分的转换规则,每条规则中包含了一个模板,并对应着一种模式。模板定义了转换的结果,而模式则规定了需要进行转换的元素或属性对象。
XML中引用XSL的语法格式如下:
<?xml-stylesheet type=“text/xsl” href=“Employees.xsl” ?>
如果在声明部分引用了多个XSL样式单,则只有第一个样式单会生效,其余的都会被忽略掉。
XSL的格式转换功能在复杂的电子商务解决方案中大有用武之地。比如,A公司和B公司都是生产机器零件的厂家,在货物清单中都包含了产品序列号以及质量等级评分。A公司的文件格式如下:
<Order>
<OrderItem>
<ItemID>12980-235</ItemID>
<Quantity>200</Quantity>
</OrderItem>
</Order>
而B公司的文件格式有所不同,相关信息都出现在元素的属性中:
<Order>
<OrderLine PartNo=“12980-235” NumRequired=“200”/>
</Order>
这样,虽然两个公司的产品完全一样,但由于文档格式的差异给双方的贸易往来设置了障碍。而使用XSL样式单可以轻松地把A公司的文档转换成B公司的格式,反之亦然。
二、XML文档转换步骤
XML文档的转换过程分为两步:
● 首先是根据XML文档构造源树,然后根据XSL规则将源树转换为结果树。目前,这种转换协议已经日趋完善,并从XSL中独立出来,成为W3C正式......
XML技术系列讲座(2)XML技术预览(2006-04-30 13:00:00)
摘要:本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-06 07:15:00)
一、显示XML
XML文档本身只描述数据内容,它的显示功能由样式单来完成。利用样式单技术时,输出平台不局限于显示器,可以是打印机、绘图仪或者是多媒体播放器。使用独立的样式单文件制定显示格式的一大优势在于:对同一份数据文件可以制定不同的样式风格,应用在不同的场合,使数据能够更合理、更有针对性地表现出来,提高了数据的重用性。
目前,W3C正式推荐的样式单标准有两种: 一种是层叠样式单CSS(Cascading Style Sheets);另一种是可扩展样式单语言XSL。
CSS最初是用于制定HTML文档显示格式的,现在也可用来对XML文档进行简单的样式规划。CSS在HTML中的应用极为广泛,但它在文本置换、依据文本内容而决定显示方式、对数据进行排序等智能化的显示功能上略显不足。
而XSL则较好地解决了CSS的这些问题,它最常用的功能是将XML的置标转换成为HTML的置标并显示输出。而且XSL还可以将XML文档向任何其他格式的结构文档进行转换。这种功能在B2B的商务模式中有着很好的应用前景。
XSL利用模式匹配的方法,选择XML文档中需要处理的元素/属性,再针对这些特定的对象制定相应的转换规则。借助XSL,我们还可以添加新的元素/属性,对所有元素/属性进行重新排序、循环处理、条件判断等程序化的控制,使其适应各种复杂的需求。
在XML文档中引用XSL的格式如下:
<?xml-stylesheet type=“text/xsl” href=“Employees.xsl” ?>
一个XML文档只能引用一个XSL样式单。XML解析器在处理XML文档时,遇到处理指令后,会载入指定的XSL样式单,然后根据其中的规则进行相应的转换处理。
二、绑定XML
Web服务器与客户机之间的数据传递方式有三种: HTML页面、XML文档以及XML数据岛。其中,XML数据岛通过特定的标签把XML数据直接嵌入到HTML文档中。采用数据岛作为交互手段,不仅可以使数据具备一定的语义信息,同时还能......
XML技术系列讲座(1)XML技术入门(2006-04-30 12:59:00)
摘要:本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-06 06:15:01)
XML与HTML的比较
Internet提供了全球范围的网络互连与通信功能,Web技术的发展更是一日千里,其丰富的信息资源给人们的学习和生活带来了极大的便利。特别是应运而生的HTML(超文本置标语言),以简单易学、灵活通用的特性,使人们发布、检索、交流信息都变得非常简单,从而使Web成了最大的环球信息资源库。然而,电子商务、电子出版、远程教育等基于Web的新兴领域的全面兴起使得传统的Web资源更加复杂化、多样化,数据量的日趋庞大对网络的传输能力也提出更高的要求。同时,人们对Web服务功能的需求也达到更高的标准,比如: 用户需要对Web进行智能化的语义搜索和对数据按照不同的需求进行多样化显示等个性化服务; 公司和企业要为客户创建和分发大量有价值的文档信息,以降低生产成本,以及对不同平台、不同格式的数据源进行数据集成和数据转化等等,这些需求越来越广泛和迫切。
传统的HTML由于自身特点的限制,不能有效地解决上述问题:作为一种简单的表示性语言,它只能显示内容而无法表达数据内容。而这一点恰恰是电子商务、智能搜索引擎所必需的。另外,HTML语言不能描述矢量图形、数学公式、化学符号等特殊对象,在数据显示方面的描述能力也不尽如人意。最重要的是:HTML只是SGML(Standard Generalized Markup Language,标准通用置标语言)的一个实例化的子集,可扩展性差,用户根本不能自定义有意义的置标供他人使用。这一切都成为Web技术进一步发展的障碍。
SGML是一种通用的文档结构描述置标语言,为语法置标提供了异常强大的工具,同时具有极好的扩展性,因此在数据分类和索引中非常有用。但SGML复杂度太高,不适合网络的日常应用,加上开发成本高、不被主流浏览器所支持等原因,使得SGML在Web上的推广受到阻碍。在这种情况下,开发一种兼具SGML的强大功能、可扩展性以及HTML的简单性的语言势在必行。由此诞生了XML语言。
XML(eXtensible Markup Language,可扩展置标语言)是由W3C于1998年2月发布的一种标准。它同样是SGML......
COM组件设计与应用(十八)(2006-02-28 12:20:00)
摘要:属性包
作者:杨老师
下载源代码
一、前言
书接上回,本回着落在介绍属性包 IPersistPropertyBag 接口的实现方法和调用方式。属性包,是以“名称 - 值”的方式提供组件持续性的支持,而“名称 - 值”恰恰又适合于用文本方式来表现。下面的片段是在 HTML 中插入 Microsoft MonthView Control ActiveX 控件后的样式:<object classid="clsid:232E456A-87C3-11D1-8BE3-0000F8754DA1" id="MonthView1">
<param name="_ExtentX" value="9393">
<param name="_ExtentY" value="4974">
<param name="_Version" value="393216">
<param name="ForeColor" value="0">
<param name="MaxSelCount" value="7">
<param name="MonthColumns" value="1">
<param name="CurrentDate" value="38632">
<param name="MaxDate" value="2958465">
<param name="MinDate" value="-53688">
</object>以文本方式保存组件属性,比较直观、容易修改,上面 HTML 示例中的 <param name="属性名" value="值"> 就很清晰。下面开始介绍如何在组件中实现 IPersistPropertyBag 接口。
二、组件的实现
(1)vc6.0 开发步骤
1、建立一个工作空间(WorkSpace)。
2、在这个工作空间中,建立 ATL 工程,示例程序工程为 Simple18。
3、增加 ATL 对象类,默认全部选项。示例程序中的 ATL 对象短名称是 Property。
4、增加一些属性。在以前的章回中......
COM 组件设计与应用(十七)(2006-02-28 12:18:00)
摘要:持续性
作者:杨老师
下载源代码
一、前言
我们写程序,经常需要实现这样的需求:
例一、程序运行产生一个窗口,用户关闭的时候需要记录窗口的位置,以便下次运行时保持位置不变;
例二、由于程序运行时间很长,今天执行一部分,明天继续执行。那么在下次运行前要恢复前次的状态;
... ... ... ...
智慧的老师:以上这些需求,如何实现呢?
懵懂的学生:这个简单,只要在程序退出前提取必要的信息保存到文件中,下次运行时再从文件中读出来,设置一下就OK了。
智慧的老师:恩,不错,这位同学的思想值得表扬。
懵懂的学生:不好意思,这都要感谢老师的栽培,我对您的景仰如滔滔江水......
智慧的老师:别臭P了,我话还没有说完那......如果你需要提取和保存的信息很多,结构很复杂......怎么办?
懵懂的学生:也好办,我设计一个结构来记录这些信息。
智慧的老师:恩......不错。但如果这些信息提供方是别人写的模块,并且随着版本的不同还经常变化,你怎么办?
懵懂的学生:... ...
智慧的老师:解决这些问题的方法是---持续性。
二、原理
持续性,也叫永久性。组件方提供 IPersistXXX 接口,调用者(容器)提供存储介质,比如文件啦、内存啦、注册表啦、流啦、文本啦......啦啦拉。需要保存的时候,调用者通过 IPersistXXX::Save() 接口函数让组件去自己存储属性信息,而调用者根本不用关心存储格式和存储内容;需要还原状态的时候,调用者打开存储介质,然后同样调用 IPersistXXX::Load() 接口函数让组件自己去读取属性信息并完成初始化的设置。
目前,微软定义了如下各种类型的持续性接口,足够满足你的需求了。我们只要在自己写的组件中实现其中一个或几个持续性接口,那么调用者就可以按照统一的方式和我们的组件协商完成属性信息的保存和状态还原了。
持续性接口
简要说明
IPersist
所有持续性接口的根,下面的接口大多从它派生出来。这个接口很简单,只有一个函数 GetClassID()它返回组件的 CLSID 号,以便调用者能保存这个号为将来 CoCre......
COM组件设计与应用(十六)(2006-02-27 14:42:00)
摘要:原文出处:http://www.vckbase.com/document/viewdoc/?id=1539
连接点(vc.net)
作者:杨老师
下载源代码
一、前言
上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。
二、原理
图一、连接点组件原理图。左侧为客户端,右侧为服务端(组件对象)
看着好复杂呀......呵呵,其实简单的紧:(注1)
1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。
也就是说可以有多个发生“事件”的源头。上图就有3个连接点;
2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。
连接点容器接口特别简单,因为只有2个函数,一个是 FindConnectionPoint(),表示查找你想要的连接点;另一个是 EnumConnectionPoints(),表示列出所有的连接点,然后你去选择使用哪个。在实际的应用中,查找法使用最多,占90%,而枚举法使用只占 10%,一般在支持第三方的插件(Plug in)时才使用。(你想写个 IE 的插件吗?我们后面就要讲到啦)
3、每一个连接点,可以被多个客户端的接收器(Sink)连接;
这个我们已经熟悉啦,还记得我们在上回书中为了管理多个回调接口,使用了 cookie 的方式进行区别吗?!
三、实现组件(一)
1、建立一个空白解决方案。
2、在解决方案中,新增 ATL 项目。示例程序中项目名称叫 Simple16, 注意不要选择“属性化编程”方式。
3、添加 ATL 类。选择 “ATL 的简单对象”。
4、名称卡片中,输入组件名称。示例程序中是 DispConnect。
5、选项卡片中,接口类型选双接口。注意一定要选择“连接点”。
6、增加接口函数。和上回书的程序一样,增加一个方法计算整数加法, 而通过连接点返回计算结果。
7、下面该增加“事件”函数了。选择......
COM组件设计与应用(十五)(2006-02-27 14:41:00)
摘要:原文出处:http://www.vckbase.com/document/viewdoc/?id=1538
连接点(vc6.0)
作者:杨老师
下载源代码
一、前言
上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。
二、原理
图一、连接点组件原理图。左侧为客户端,右侧为服务端(组件对象)
看着好复杂呀......呵呵,其实简单的紧:(注1)
1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。
也就是说可以有多个发生“事件”的源头。上图就有3个连接点;
2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。
连接点容器接口特别简单,因为只有2个函数,一个是 FindConnectionPoint(),表示查找你想要的连接点;另一个是 EnumConnectionPoints(),表示列出所有的连接点,然后你去选择使用哪个。在实际的应用中,查找法使用最多,占90%,而枚举法使用只占 10%,一般在支持第三方的插件(Plug in)时才使用。(你想写个 IE 的插件吗?我们后面就要讲到啦)
3、每一个连接点,可以被多个客户端的接收器(Sink)连接;
这个我们已经熟悉啦,还记得我们在上回书中为了管理多个回调接口,使用了 cookie 的方式进行区别吗?!
三、实现组件(一)
1、建立一个工作区(WorkSpace)
2、在工作区中,建立一个 ATL 工程(Project)。示例程序中工程名称叫 Simple15,接受全部默认选项。
3、ClassView 中,执行鼠标右键菜单命令 New Atl Object...,添加 ALT 类。
4、左侧分类 Category 选择 Objects,右侧 Objects 选择 SimpleObject(其实就是默认项目)。
5、名称 Name 卡片中,输入组件名称。示例程序中是 DispConnect。
6、属性 Attributes 卡片中,接口类型选......
COM组件设计与应用(十四)(2006-02-25 13:57:00)
摘要:原文出处:http://www.vckbase.com/document/viewdoc/?id=1526
事件和通知(vc.net)
作者:杨老师
下载源代码
一、前言
我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者;
我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者;
我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者;
... ... ... ...
本回书开始话说 COM 的事件、通知、连接点......这些内容比较多,我分两次(共四回)来介绍。
二、通知的方法
当程序甲方内部发生了某个事件的时候,需要通知乙方,无非使用几个方法:
通知方式
简单说明
评论
直接消息
PostMessage()
PostThreadMessage()
向窗口或线程发个消息
你什么时候执行我就不管啦
SendMessage()
马上执行消息响应函数
不执行完消息处理函数不会返回
SendMessage(WM_COPYDATA...)
发消息的同时,还可以带过去一些自定义的数据
比较常用,所以单独列了出来
间接消息
InvalidateRect()
SetTimer()
......
被调用的函数会发送相关的一些消息
这样的函数太多了
回调函数
GetOpenFileName()......
当用户改变文件选择的时候,执行回调函数
嗨!哥们,这是我的电话,有事就言语一声。
在 COM 的时代,以上这些方法就基本上不能玩转了,因为...您想呀 COM 组件是运行在分布式环境中的,地球另一边计算机上运行的组件,怎么可能给你的窗口发消息那?当然不能!(但话又说回来,对于 ActiveX 这样只能在本地运行的组件,当然也可以发送窗口消息的啦。)
回调函数的方式,是设计 COM 通知方法的基础。回调函数,本质上是预先把某一函数的指针告诉我,当我有必要的时候,就直接呼叫该函数了,而这个回调函数做了什么,怎么做的,我是根本不关心的。好了,问你个问题:啥是 COM 的接口?接口其实就是......
COM组件设计与应用(十三)(2006-02-25 13:56:00)
摘要:原文出处:http://www.vckbase.com/document/viewdoc/?id=1525
事件和通知(VC6.0)
作者:杨老师
下载源代码
一、前言
我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者;
我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者;
我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者;
... ... ... ...
本回书开始话说 COM 的事件、通知、连接点......这些内容比较多,我分两次(共四回)来介绍。
二、通知的方法
当程序甲方内部发生了某个事件的时候,需要通知乙方,无非使用几个方法:
通知方式
简单说明
评论
直接消息
PostMessage()
PostThreadMessage()
向窗口或线程发个消息
你什么时候执行我就不管啦
SendMessage()
马上执行消息响应函数
不执行完消息处理函数不会返回
SendMessage(WM_COPYDATA...)
发消息的同时,还可以带过去一些自定义的数据
比较常用,所以单独列了出来
间接消息
InvalidateRect()
SetTimer()
......
被调用的函数会发送相关的一些消息
这样的函数太多了
回调函数
GetOpenFileName()......
当用户改变文件选择的时候,执行回调函数
嗨!哥们,这是我的电话,有事就言语一声。
在 COM 的时代,以上这些方法就基本上不能玩转了,因为...您想呀 COM 组件是运行在分布式环境中的,地球另一边计算机上运行的组件,怎么可能给你的窗口发消息那?当然不能!(但话又说回来,对于 ActiveX 这样只能在本地运行的组件,当然也可以发送窗口消息的啦。)
回调函数的方式,是设计 COM 通知方法的基础。回调函数,本质上是预先把某一函数的指针告诉我,当我有必要的时候,就直接呼叫该函数了,而这个回调函数做了什么,怎么做的,我是根本不关心的。好了,问你个问题:啥是 COM 的接口?接口其实就是一......