<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[网络搜罗充门面]]></title>
<link>http://blog.pfan.cn/mroske</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[无题]]></title>
		<link>http://blog.pfan.cn/mroske/17056.html</link>
		<description><![CDATA[&nbsp;&nbsp;&nbsp; 辞职在家呆了差不多一年半，差点忘了赚到钱时的那种感觉。不过有幸一个朋友需要我帮忙，他要我帮他搞定一个业务。没什么难度，只是那位朋友经验少了点，造成了本来一天可以搞定的，变成三天才搞定。拿到久违的报酬，不知道心理是喜还是悲。喜的是我知道我还有一点能力，悲的是这种能力谁都有。
&nbsp;&nbsp;&nbsp; 昨天晚上在看电视时，说“七夕”节又到了，而且今年有两次。就算三次也没用，像我这种屎壳郎是没有织女的。不过两年前我接到一个到如今都还感动的电话，因为她在“七夕”的早上七点零七分打的。她在电话里告诉我快来接她，要我十五分钟之内到达那里。虽然这对我这样的凡人来说是不可能的，但我还是努力了一下，结果可想而知。除非我像那只猴子，脚踩七色云彩，否则这是一个美丽的笑话。
&nbsp;&nbsp;&nbsp; 曾经我很傻，现在也是。]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-07-31 23:11:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（13）XML与电子商务]]></title>
		<link>http://blog.pfan.cn/mroske/13506.html</link>
		<description><![CDATA[随着计算机技术的发展，企业的大部分业务都逐步由计算机实现自动化处理，而随着网络技术的不断发展，通过网络实现企业间的信息交换也逐渐成为企业进行电子商务的一种重要手段。但是计算机技术从诞生至今已经半个多世纪，各种类型的操作系统平台不胜枚举，运行其上的各种应用程序更是五花八门，要实现机器之间无歧义性的信息识别和处理，一直是困扰电子商务发展的难点。传统解决方案高成本低产出的模式已经不能适应新的全球经济发展趋势，因此企业急需有新的技术能够更快捷、有效地进行信息的集成和发布。







EDI的发展







EDI（Electronic Data Interchange，电子数据交换）是出现在20世纪70年代的一项信息技术，它试图通过计算机网络将不同的计算机系统联系起来，将传统的订购、交易、支付等贸易手段全部通过计算机网络实现，用户将订单、发票、提货单、许可证等贸易信息按照协议标准制作成统一格式的文件发送给对方，接收方按照统一语法格式解读文件，然后通过计算机实现自动化处理。应当说，EDI的大范围使用是可以降低数据处理费用和数据重复录入费用，从而提高经济效益的，但它的一些致命缺陷限制了它的普及应用。



首先是生产成本太高。传统的EDI需要购买或开发专用的数据格式转换软件，需要架设商业服务器控制数据流，还要购买VAN（Value Added Network，增值网络）来确保发送和接收的商业信息的安全和机密。除了少数大企业有能力外，大多数中小企业只能是望“网”兴叹。这也是EDI存在了近30年，但迄今也未规模化、普及化的根本原因。



其次，在实现EDI时，不同的企业会根据它在贸易中所扮演的角色不同，对标准有选择地进行删减，从而构成了独有的标准版本，不同版本之间的EDI消息却根本不能互相处理。



　　但Internet的蓬勃发展赋予了EDI新的生机。基于Internet的B2B（business-to-business）电子商务模式更是把传统EDI这种小范围的、局部的、昂贵的商务形式推广到一个开放的、公众化的、廉价的系统中，未来企业的生产销售和运营模式势必发生根本性的改变。











BizTalk概述







　　通过以往内容的学习，我们已]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-03 18:37:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（12）验证XML数据合法性（下）]]></title>
		<link>http://blog.pfan.cn/mroske/13505.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-12 07:15:00)




１、制定Schema



考虑如下XML文档books.xml：



&lt;?xml version=“1.0”?&gt;



&lt;booklist&gt;



&lt;book&gt;



&lt;title&gt;Straight Talk About Computers &lt;/title&gt;



&lt;author&gt;Lars Peterson&lt;/author&gt;



&lt;/book&gt;



&lt;book&gt;



&lt;title&gt;You Can Comabt Computer Stress&lt;/title&gt;



&lt;author&gt;Lars Peterson&lt;/author&gt;



&lt;author&gt;Carlos Diaz&lt;/author&gt;



&lt;/book&gt;



&lt;/booklist&gt;



为上述XML文档制定Schema时，可以先为&lt;title&gt;和&lt;author&gt;元素制定规则，用&lt;ElementType&gt;定义它们为只能包含字符串的文本元素：



&lt;ElementType name=“title” content=“textOnly” dt:type=“string” /&gt;



&lt;ElementType name=“author” content=“textOnly” dt:type=“string” /&gt;



然后说明&lt;book&gt;只能包含子元素，且子元素出现的顺序是一定的。随后在内部用&lt;element&gt;定义&lt;book&gt;包括一个&lt;title&gt;和任意个&lt;author&gt;子元素：



&lt;ElementType name=“book” content=“eltOnly” ord]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-03 18:36:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（11）验证XLM数据合法性(上)]]></title>
		<link>http://blog.pfan.cn/mroske/13504.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-12 06:15:00)




１、XML的合法性验证



应用XML技术的一个主要目标是为了方便信息交换。很显然，只有XML文档的格式或是结构得到交互各方的一致认可，这个目标才有可能实现。XML Schema（大纲）和DTD就是描述信息结构的模型，可以用来对XML文档内容的合法性进行验证。 



Schema和DTD规定了在文档中能够使用的元素和属性，以及这些对象与文本内容的可能组合形式。作为对文档验证的标准，Schema和DTD不仅应该能被人们理解，对应用程序来说也应当是易于理解的。对文档合法性的验证包括两个方面：一方面是语法结构的验证，即元素类型、元素嵌套格式、属性类型、属性值数据类型、属性值是否可选等相关文档对象单元本身及其结构的合法性；另一方面是语义的验证，只有真正理解了XML文档的含义才能算是实现了信息交互，否则仅是结构上正确但意义模糊的信息，对于接收方来说一样是无用的，有时甚至会产生误解，起到相反的作用。



对XML文档的验证有如下几个步骤：



1．定义一份XML Schema或DTD: Schema或DTD为同一类型的所有文档定义了结构标准，比如有关书籍信息的文档可共享一份标准。



2．应用Schema或DTD：一般由文档的作者指定Schema，这样接收方可以很快地根据说明对文档进行验证。但在C/S（客户机/服务器）环境中，由于服务器无法判断XML在客户端是否已经验证过，所以为了能够确保验证过程，也为了避免可能的重复验证，对文档应用Schema或DTD的操作由服务器完成。



3．运行解析器进行验证：解析器在装载文档的同时扫描结构，遇到任何错误都会终止装载过程，并做出适当的响应。



２、Schema和DTD的区别



虽然，XML Schema和DTD都是用于文档验证，但二者还是有一定的区别，其中前者更为精确和灵活：



● XML Schema是一种内容“开放”的模型，可扩展、功能强，而DTD是内容“封闭”的模型，可扩展性差；



● XML Schema支持丰富的数据类型，完全能够满足网络应用特别是电子商务的需]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-03 18:36:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（10）客户机与服务器的数据交互（下）]]></title>
		<link>http://blog.pfan.cn/mroske/13503.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-11 07:15:00)




１、XMLHTTP对象的Send方法



用Open方法对Request对象进行初始化后，调用Send方法发送XML数据：



poster.send XML-data



Send方法的参数类型是Variant，可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下，数据包一旦发送完毕，就结束Send进程，客户机执行其他的操作；而在同步方式下，客户机要等到服务器返回确认消息后才结束Send进程。



XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示：







值
说明

0
Response对象已经创建，但XML文档上载过程尚未结束

1
XML文档已经装载完毕

2
XML文档已经装载完毕，正在处理中

3
部分XML文档已经解析

4
文档已经解析完毕，客户端可以接受返回消息



２、 服务器端的数据处理 



服务器在接收到客户机发送过来的数据包后，会马上处理数据，并做出相应的响应。服务器先创建一个XMLDOM对象，然后将Request对象中的数据载入，并通过XMLDOM对象开始访问XML数据。



在获得XML数据的访问入口后，首先做的事情是对XML文档进行验证（这部分的具体过程我们将在后面介绍XML Schema的时候一并说明）。一旦通过验证，就可以利用DOM接口对XML数据进行分析处理（例如：将提取的信息用来更新数据库中的记录）。



一个简单的ASP脚本如下：



&lt;%



Set docReceived = CreateObject(“Microsoft.XMLDOM”)



docReceived.async = False



docReceived.load Request



Set rootNode = docReceived.documentEl]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-03 18:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（9）客户机与服务器的数据交互（上）]]></title>
		<link>http://blog.pfan.cn/mroske/13502.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-11 06:15:00)




１、C/S的通信模式



我们在前面文章中讨论客户机与服务器的数据交互时，数据流的方向总是从服务器到客户机，很少涉及到客户机向服务器发送请求并处理返回信息的问题。实际上，在电子商务中，客户机向服务器发送数据也是一个重要的环节，如用户填写的货物订单等。



在传统的实现方案中，用户端只要在订单中做出微小的变动，就要向服务器发送消息，要求更新数据。这样就增加了服务器和网络的负载，降低了工作效率。更有效的工作方式是在客户机端对变更的信息进行缓存，然后分批定量地发送给服务器，这样一些不确定的修改信息都首先存储在客户机，只有那些确定的需要更新的数据才会发送出去，从而避免了网络和服务器做许多无谓的操作。



２、基于XML的C/S



使用XML进行C/S间的通信是一种高效的工作方式。首先在客户机对XML数据打包，然后以XML数据包为单元发送给服务器，服务器在处理完数据之后返回消息，客户机接收到消息后执行其他操作，从而结束一次通信周期。



具体实现步骤如下：



● 客户机构造一个XMLDOM对象，作为发送XML数据的载体；



● 客户机创建一个XMLHTTP对象，该对象包括多种方法和属性，可以发送XML数据到服务器上的应用程序（如ASP页面），同时准备接收响应信息；



● 客户机将XML数据包转载到XMLHTTP对象上并发送给ASP页面；



● 服务器执行ASP，并创建一个服务器端XMLDOM对象来接收XML数据；



● ASP把数据包装载到服务器端的XMLDOM对象上；



● ASP对XML数据进行必要的处理，并返回确认消息；



● 客户机接收响应消息，执行下一步操作。



３、向服务器发送数据



客户机的首要任务是构造XML数据包。XMLDOM作为数据包的载体其数据来源可以是任何XML文档或是XML文档的片段（如XML数据岛），甚至可以是使用loadXML方法接收用户输入信息后动态生成的XML文档。



下面是动态生成的一个XML文档：]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-03 18:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（8）通过DOM操作数据（下）]]></title>
		<link>http://blog.pfan.cn/mroske/13454.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-10 07:20:01)




１、DOM解析时的错误



DOM在解析XML文档的时候可能会产生各式各样的错误，可以根据ParseError对象中的属性得知出错的可能原因及相关信息。



常用的属性及其含义如下表所示：







属性
说明

errorCode
错误代码

filepos
错误在文档中的绝对字符位置

line
错误所在行的行号

linepos
错误所在行的字符位置

reason
错误产生原因

srcText
错误所在行的源代码

url
最近一份含有解析错误的XML文档的URL地址



 



２、访问DOM树中的元素与属性



DOM还提供了许多查找节点的方法。其中基于搜索机制的方法有：



● 根据标签名称搜索元素；



● 使用XSL模式搜索节点；



● 利用集合索引搜索节点。



以books.xml为例，Document对象中的getElementsByTagName方法就是根据参数中的标签名称在全文范围内查找元素的，返回值是一个NodeList对象：



Set doc = dsoDetails.XMLDocument 



Set authors = doc.getElementsByTagName(“author”)



上述查询结果中包含了文档中出现的全部4位作者。如果调用的是Element对象中的getElementsByTagName方法，除了搜索范围缩小为该元素的所有后继节点之外，其他的情况都是一样的。



所有类型的节点都带有selectNodes方法，该方法的唯一参数是XSL的模式规则，返回值是匹配该规则的结果集合。调用这个方法可以利用XSL的模式匹配策略查找节点。例如：



Set rootNode = doc.documentElement 



Set cheapbooks = rootNode.selectNodes(“//book[price &lt; 10]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-01 11:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（7）通过DOM操作数据（上）]]></title>
		<link>http://blog.pfan.cn/mroske/13453.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-09 07:20:00)




１、DOM树



所有类型的XML解析器都要求处理对象是“格式良好”的XML文档，有些还能根据DTD或XML Schema进行有效性验证，DOM（Document Object Model）解析器将XML文档一次性解析，生成一个位于内存中的对象树用以描述该文档。



DOM是一种与平台和语言无关的接口，它允许程序和脚本动态访问和修改文档的内容、结构和类型。它定义了一系列的对象和方法对DOM树的节点进行各种随机操作：



● Document对象：作为树的最高节点，Document对象是对整个文档进行操作的入口。



● Element和Attr对象：这些节点对象都是文档某一部分的映射，节点的定级层次恰好反映了文档的结构。



● Text对象：作为Element和Attr对象的子节点，Text对象表达了元素或属性的文本内容。Text节点不再包含任何子节点。



● 集合索引：DOM提供了几种集合索引方式，可以对节点按指定方式进行遍历。索引参数都是从0开始记数的。



DOM树中的所有节点都是从Node对象继承而来的。Node对象定义了一些最基本的属性和方法，利用这些方法可以实现对树的遍历，同时，根据属性还可以得知节点的名称、取值并判断其类型。



利用DOM，开发人员可以动态地创建XML、遍历文档、增加/删除/修改文档内容。DOM提供的API与编程语言无关，所以对一些DOM标准中没有明确定义的接口，不同解析器的实现方法也可能有所差别。为方便描述，本文的举例均采用MSXML DOM方案并用VB Script编写代码。



２、DOM树的结构



Document对象建立之后，就可以与XML文档或数据岛联系在一起。数据岛的加载方法是将数据岛ID赋给Document对象：



&lt;XML ID=“dsoDetails” src=“Books.xml”&gt;&lt;/XML&gt;



Set doc = dsoDetails.XMLDocument



加载文档大体上分为三步：]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-01 11:43:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（6）XML与HTML的结合（下）]]></title>
		<link>http://blog.pfan.cn/mroske/13452.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-08 07:15:00)




１、XML的嵌套处理



一般情况下，我们从数据库中查询得到的结果集可能很大，所以从服务器返回到客户端时，数据会被分成若干个页面分别进行传递。此时，利用TABLE元素中的DATAPAGESIZE属性可以指定每个页面包含记录集条目的个数。



例如：



&lt;TABLE DATASRC=“#xmldso” DATAPAGESIZE=10&gt;



很显然，如果XML数据格式是对称的，则无论是映射到ADO记录集还是绑定到表格元素上，效果都会很好。而在实际应用中，XML数据为非对称的例子也很多，比如一本书的作者可能就不止一位，这在映射和绑定时都会产生一定的麻烦。解决问题的办法就是利用嵌套。每一行表格仍对应一条主元素，每一栏也对应着一个子元素。对于重复元素，则使用嵌套的表格。我们假设在books.xml中，第一本书的作者为Dean Straight，第二本书的作者为Charlotte Cooper、Shelley Burke和Regina Murphy。此时，绑定过程如下：



● 创建TABLE元素，并将数据岛ID赋值给DATAFLD属性；



● 对于单独的XML元素，如&lt;isbn&gt;，创建TD元素，并设定相应的DATAFLD属性；



● 对于重复元素，在TD元素内部嵌套一个表格；



● 用单行单列的形式显示作者信息。



注意这里的DATAFLD属性必须设定为“$TEXT”，



以保证嵌套元素的内容被全部显示在指定的元素中。



完整的HTML代码如下所示：



&lt;TABLE BORDER=1 DATASRC=“#xmldso”&gt;



&lt;THEAD&gt;&lt;TR&gt;&lt;TH&gt;Title&lt;/TH&gt;



&lt;TH&gt;ISBN&lt;/TH&gt;



&lt;TH&gt;Author&lt;/TH&gt;&lt;/TR&gt;&lt;/THEAD&gt;



&lt;TBOD]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-01 11:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（5）XML与HTML的结合（上）]]></title>
		<link>http://blog.pfan.cn/mroske/13451.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-08 06:15:00)




１、XML的局限性



目前，许多Web网站的内容数据都存放在数据库或数据文件中。对于Web程序开发人员来说，如果要想把有用的信息从数据库中提取出来，传统的方法是在服务器端编写脚本程序（如VBScript、JavaScript、CGI、ASP、Perl等等），通过对数据库执行SQL查询得到相关记录，然后把查询结果组织成HTML页面返回给客户端，用户使用浏览器观察最终结果。



为了提高系统服务的灵活性、可扩展性，使服务对象范围更广，许多商业网站都尽可能地把商务规则、原始数据和表现形式当做相互独立的服务分别提供。HTML那种蕴数据于显示之中的方式显然不合乎这种需求。因此，把原始数据存放在XML文档中，使用样式单文件显示内容是XML技术适合于电子商务的优势所在。但从本质上来说，XSL技术不是面向数据显示的，它是一种格式转换技术，在显示手段和方式上都远不及HTML那样丰富。对编程人员来说，一种较为理想的方案是把HTML和XML两种技术相结合，优势互补，使真正的原始数据在能够保持本来意义和结构的同时，还能充分利用HTML那千变万化的显示技巧。XML数据岛就是这种技术融合的产物，它使用&lt;XML&gt;标签把XML数据直接嵌入到HTML页面中，从而实现了二者的优势互补。



２、IE中数据岛的处理方式



为了能够处理这种内嵌XML代码的HTML页面，Internet Explorer 4.0（以下简称IE 4.0）引入了DSO（Data Source Objects，数据源对象）技术，用Java Applet实现。



例如：



&lt;APPLET CODE=“com.ms.xml.dso.XMLDSO.class” ID=“xmldso” WIDTH=0 HEIGHT=0 MAYSCRIPT=TRUE&gt;



&lt;PARAM NAME=“URL” VALUE=“myXML.xml”&gt;



&lt;/APPLET&gt;



上述例子中，CODE属性指明了DSO Java小程序，MAYSCRIPT属性保]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-05-01 11:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（4）XML的显示—XSL样式单(下)]]></title>
		<link>http://blog.pfan.cn/mroske/13419.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-07 07:15:01)




一、XSL模板的使用



XSL在输出模板中描述输出格式，这些格式可以是各种字符串、标签符号、节点值或者是一些XSL语法结构，如条件判断、循环处理等。在许多应用场合中，输出模板中需要使用节点的取值，此时可以根据需要使用元素输出节点值，最直接的使用方式是，这样可以输出当前节点及其所有后继节点的取值。而如果仅仅是想输出指定节点的取值，可以利用select属性进行限定（select属性可以是任意合法的路径表达式）：











上述第一个表达式匹配的对象是当前节点的所有子节点中名称为的元素，第二个表达式匹配的对象则是当前节点中所有后继节点中名为的元素。注意: 在XSL样式单中必须有一个模板规则与根元素相匹配。



在确定了模板规则与元素相匹配之后，就可以激活模板，这项任务由元素完成。它和元素相结合就如同编程中的函数调用:前者是调用指令，而后者就是函数体。对于不同的元素需要调用不同的模板进行处理。为了激活样式单中的模板规则，要在根元素模板规则中使用元素，这样就会层层作用使整个样式单文件生效：











直接使用元素表示不加区分地对当前节点的所有子节点应用模板，而在select属性中书写匹配式则能够限定作用对象：





























































上述第一个模板与XML文档的根元素相匹配，并对根节点以下的所有元素应用模板规则。然后，一旦遇到标签，就插入一个 
标签作为空白段落，接着对元素和元素分别应用模板规则。最后，经过转换显示的结果是36磅字体的职员名字和用斜体字表示的职员薪水。



二、XSL的扩展规则



1. 路径指示符



除了前面介绍的“//”和“/”路径指示符，以及统配符“*”，还有几个符号可以用来对模板的匹配对象进行限制：



● 当前节点指示符为“.”；]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-04-30 13:03:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（3）XML的显示——XSL样式单(上)]]></title>
		<link>http://blog.pfan.cn/mroske/13418.html</link>
		<description><![CDATA[本文出自:http://www.computerworld.com.cn 作者: 北京邮电大学 张剑 (2002-02-07 06:15:00)




一、XML文档转换原理



数据格式转换的重要思想是要把XML文档视为一种树结构，转换的过程就是从源树生成结果树的过程。XSL样式单定义了源树和结果树中对应部分的转换规则，每条规则中包含了一个模板，并对应着一种模式。模板定义了转换的结果，而模式则规定了需要进行转换的元素或属性对象。



XML中引用XSL的语法格式如下：



&lt;?xml-stylesheet type=“text/xsl” href=“Employees.xsl” ?&gt;



如果在声明部分引用了多个XSL样式单，则只有第一个样式单会生效，其余的都会被忽略掉。



XSL的格式转换功能在复杂的电子商务解决方案中大有用武之地。比如，A公司和B公司都是生产机器零件的厂家，在货物清单中都包含了产品序列号以及质量等级评分。A公司的文件格式如下：



&lt;Order&gt;



&lt;OrderItem&gt;



&lt;ItemID&gt;12980-235&lt;/ItemID&gt;



&lt;Quantity&gt;200&lt;/Quantity&gt;



&lt;/OrderItem&gt;



&lt;/Order&gt;



而B公司的文件格式有所不同，相关信息都出现在元素的属性中：



&lt;Order&gt;



&lt;OrderLine PartNo=“12980-235” NumRequired=“200”/&gt;



&lt;/Order&gt;



这样，虽然两个公司的产品完全一样，但由于文档格式的差异给双方的贸易往来设置了障碍。而使用XSL样式单可以轻松地把A公司的文档转换成B公司的格式，反之亦然。



二、XML文档转换步骤



XML文档的转换过程分为两步：



● 首先是根据XML文档构造源树，然后根据XSL规则将源树转换为结果树。目前，这种转换协议已经日趋完善，并从XSL中独立出来，成为W3C正式]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-04-30 13:01:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（2）XML技术预览]]></title>
		<link>http://blog.pfan.cn/mroske/13417.html</link>
		<description><![CDATA[本文出自: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的格式如下：



&lt;?xml-stylesheet type=“text/xsl” href=“Employees.xsl” ?&gt;



一个XML文档只能引用一个XSL样式单。XML解析器在处理XML文档时，遇到处理指令后，会载入指定的XSL样式单，然后根据其中的规则进行相应的转换处理。



二、绑定XML



Web服务器与客户机之间的数据传递方式有三种: HTML页面、XML文档以及XML数据岛。其中，XML数据岛通过特定的标签把XML数据直接嵌入到HTML文档中。采用数据岛作为交互手段，不仅可以使数据具备一定的语义信息，同时还能]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-04-30 13:00:00</pubDate>
		</item>
				<item>
		<title><![CDATA[XML技术系列讲座（1）XML技术入门]]></title>
		<link>http://blog.pfan.cn/mroske/13416.html</link>
		<description><![CDATA[本文出自: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]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-04-30 12:59:00</pubDate>
		</item>
				<item>
		<title><![CDATA[COM组件设计与应用（十八）]]></title>
		<link>http://blog.pfan.cn/mroske/10614.html</link>
		<description><![CDATA[属性包作者：杨老师
下载源代码一、前言　　书接上回，本回着落在介绍属性包 IPersistPropertyBag 接口的实现方法和调用方式。属性包，是以“名称 - 值”的方式提供组件持续性的支持，而“名称 - 值”恰恰又适合于用文本方式来表现。下面的片段是在 HTML 中插入 Microsoft MonthView Control ActiveX 控件后的样式：&lt;object classid="clsid:232E456A-87C3-11D1-8BE3-0000F8754DA1" id="MonthView1"&gt;
	&lt;param name="_ExtentX" value="9393"&gt;
	&lt;param name="_ExtentY" value="4974"&gt;
	&lt;param name="_Version" value="393216"&gt;
	&lt;param name="ForeColor" value="0"&gt;
	&lt;param name="MaxSelCount" value="7"&gt;
	&lt;param name="MonthColumns" value="1"&gt;
	&lt;param name="CurrentDate" value="38632"&gt;
	&lt;param name="MaxDate" value="2958465"&gt;
	&lt;param name="MinDate" value="-53688"&gt;
&lt;/object&gt;以文本方式保存组件属性，比较直观、容易修改，上面 HTML 示例中的 &lt;param name="属性名" value="值"&gt; 就很清晰。下面开始介绍如何在组件中实现 IPersistPropertyBag 接口。二、组件的实现（1）vc6.0 开发步骤1、建立一个工作空间(WorkSpace)。2、在这个工作空间中，建立 ATL 工程，示例程序工程为 Simple18。3、增加 ATL 对象类，默认全部选项。示例程序中的 ATL 对象短名称是 Property。4、增加一些属性。在以前的章回中，我们只介绍了增加接口函数的方法，由于今天是首次增加接口属性，所以稍微细致一些。步骤是，在Cla]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-02-28 12:20:00</pubDate>
		</item>
				<item>
		<title><![CDATA[COM&nbsp;组件设计与应用（十七）]]></title>
		<link>http://blog.pfan.cn/mroske/10613.html</link>
		<description><![CDATA[持续性作者：杨老师
下载源代码一、前言　　我们写程序，经常需要实现这样的需求：例一、程序运行产生一个窗口，用户关闭的时候需要记录窗口的位置，以便下次运行时保持位置不变；例二、由于程序运行时间很长，今天执行一部分，明天继续执行。那么在下次运行前要恢复前次的状态；... ... ... ...智慧的老师：以上这些需求，如何实现呢？懵懂的学生：这个简单，只要在程序退出前提取必要的信息保存到文件中，下次运行时再从文件中读出来，设置一下就OK了。智慧的老师：恩，不错，这位同学的思想值得表扬。懵懂的学生：不好意思，这都要感谢老师的栽培，我对您的景仰如滔滔江水......智慧的老师：别臭P了，我话还没有说完那......如果你需要提取和保存的信息很多，结构很复杂......怎么办？懵懂的学生：也好办，我设计一个结构来记录这些信息。智慧的老师：恩......不错。但如果这些信息提供方是别人写的模块，并且随着版本的不同还经常变化，你怎么办？懵懂的学生：... ...智慧的老师：解决这些问题的方法是---持续性。二、原理　　持续性，也叫永久性。组件方提供 IPersistXXX 接口，调用者（容器）提供存储介质，比如文件啦、内存啦、注册表啦、流啦、文本啦......啦啦拉。需要保存的时候，调用者通过 IPersistXXX::Save() 接口函数让组件去自己存储属性信息，而调用者根本不用关心存储格式和存储内容；需要还原状态的时候，调用者打开存储介质，然后同样调用 IPersistXXX::Load() 接口函数让组件自己去读取属性信息并完成初始化的设置。　　目前，微软定义了如下各种类型的持续性接口，足够满足你的需求了。我们只要在自己写的组件中实现其中一个或几个持续性接口，那么调用者就可以按照统一的方式和我们的组件协商完成属性信息的保存和状态还原了。　 



持续性接口
简要说明

IPersist
&nbsp;　　所有持续性接口的根，下面的接口大多从它派生出来。这个接口很简单，只有一个函数 GetClassID()它返回组件的 CLSID 号，以便调用者能保存这个号为将来 CoCreateInstance() 启动组件用。&nbsp;　　实现这个函数也很简单，只要返回你组件中的 CLSID_XXX 即可，或者比较省事的方法是返回 GetObjectCLSID()]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-02-28 12:18:00</pubDate>
		</item>
				<item>
		<title><![CDATA[COM组件设计与应用（十六）]]></title>
		<link>http://blog.pfan.cn/mroske/10582.html</link>
		<description><![CDATA[原文出处：http://www.vckbase.com/document/viewdoc/?id=1539
连接点(vc.net)作者：杨老师
下载源代码一、前言　　上回书介绍了回调接口，在此基础上，我们理解连接点就容易多了。二、原理图一、连接点组件原理图。左侧为客户端，右侧为服务端（组件对象）　　看着好复杂呀......呵呵，其实简单的紧：（注1）1、一个 COM 组件，允许有多个连接点对象(IConnectionPoint)。&nbsp;&nbsp; 也就是说可以有多个发生“事件”的源头。上图就有3个连接点；2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。&nbsp;&nbsp; 连接点容器接口特别简单，因为只有2个函数，一个是 FindConnectionPoint()，表示查找你想要的连接点；另一个是 EnumConnectionPoints()，表示列出所有的连接点，然后你去选择使用哪个。在实际的应用中，查找法使用最多，占90%，而枚举法使用只占 10%，一般在支持第三方的插件(Plug in)时才使用。（你想写个 IE 的插件吗？我们后面就要讲到啦）3、每一个连接点，可以被多个客户端的接收器(Sink)连接；&nbsp;&nbsp; 这个我们已经熟悉啦，还记得我们在上回书中为了管理多个回调接口，使用了 cookie 的方式进行区别吗？！三、实现组件（一）1、建立一个空白解决方案。2、在解决方案中，新增 ATL 项目。示例程序中项目名称叫 Simple16， 注意不要选择“属性化编程”方式。3、添加 ATL 类。选择 “ATL 的简单对象”。4、名称卡片中，输入组件名称。示例程序中是 DispConnect。5、选项卡片中，接口类型选双接口。注意一定要选择“连接点”。6、增加接口函数。和上回书的程序一样，增加一个方法计算整数加法， 而通过连接点返回计算结果。7、下面该增加“事件”函数了。选择事件接口(_IDispConnectEvents)，添加函数。8、该函数用来返回 Add() 函数的计算结果。9、生成事件代理类程序代码。选择组件类对象(CDispConnect)，执行鼠标右键菜单“添加连接点”10、选择你要让 IDE 帮你生成哪个连接点的代理程序代码。我们这个组件只有一个连接点，那只好选择它了。 （]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-02-27 14:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[COM组件设计与应用（十五）]]></title>
		<link>http://blog.pfan.cn/mroske/10581.html</link>
		<description><![CDATA[原文出处：http://www.vckbase.com/document/viewdoc/?id=1538
连接点(vc6.0)作者：杨老师
下载源代码一、前言　　上回书介绍了回调接口，在此基础上，我们理解连接点就容易多了。二、原理图一、连接点组件原理图。左侧为客户端，右侧为服务端（组件对象）　　看着好复杂呀......呵呵，其实简单的紧：（注1）1、一个 COM 组件，允许有多个连接点对象(IConnectionPoint)。&nbsp;&nbsp; 也就是说可以有多个发生“事件”的源头。上图就有3个连接点；2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。&nbsp;&nbsp; 连接点容器接口特别简单，因为只有2个函数，一个是 FindConnectionPoint()，表示查找你想要的连接点；另一个是 EnumConnectionPoints()，表示列出所有的连接点，然后你去选择使用哪个。在实际的应用中，查找法使用最多，占90%，而枚举法使用只占 10%，一般在支持第三方的插件(Plug in)时才使用。（你想写个 IE 的插件吗？我们后面就要讲到啦）3、每一个连接点，可以被多个客户端的接收器(Sink)连接；&nbsp;&nbsp; 这个我们已经熟悉啦，还记得我们在上回书中为了管理多个回调接口，使用了 cookie 的方式进行区别吗？！三、实现组件（一）1、建立一个工作区(WorkSpace)2、在工作区中，建立一个 ATL 工程(Project)。示例程序中工程名称叫 Simple15，接受全部默认选项。3、ClassView 中，执行鼠标右键菜单命令 New Atl Object...，添加 ALT 类。4、左侧分类 Category 选择 Objects，右侧 Objects 选择 SimpleObject（其实就是默认项目）。5、名称 Name 卡片中，输入组件名称。示例程序中是 DispConnect。6、属性 Attributes 卡片中，接口类型选 Dual 双接口。注意一定要选择 Support Connection Points 来支持连接点。7、ClassView 中，选择接口（IDispConnect），鼠标右键菜单添加函数 Add Method...8、增加函数。和上回书的程序一样]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-02-27 14:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[COM组件设计与应用（十四）]]></title>
		<link>http://blog.pfan.cn/mroske/10480.html</link>
		<description><![CDATA[原文出处：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中不使用“回调函数”而是使用“回调接口”（说的再清楚一些，就是使]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-02-25 13:57:00</pubDate>
		</item>
				<item>
		<title><![CDATA[COM组件设计与应用（十三）]]></title>
		<link>http://blog.pfan.cn/mroske/10479.html</link>
		<description><![CDATA[原文出处：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 的接口？接口其实就是一组相关函数的集合（这个定义不严谨，但你可以这么理解哈）。因此，在COM中不使用“回调函数”而是使用“回调接口”（说的再清楚一些，就是使用]]></description>
		<author><![CDATA[mroske]]></author>
		<pubDate>2006-02-25 13:56:00</pubDate>
		</item>
		</channel>
</rss>