﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-鱼上游-随笔分类-爪哇友邻真不少</title><link>http://www.blogjava.net/bibi/category/4907.html</link><description>&lt;font size=2&gt;笨鸟后飞，天空会有我翅膀划过的痕迹！&lt;br&gt;关注世界，真情人生，扫描人间百态！&lt;br&gt;My contact: o_olle_e@hotmail.com&lt;/font&gt; 
</description><language>zh-cn</language><lastBuildDate>Wed, 26 Aug 2009 13:43:23 GMT</lastBuildDate><pubDate>Wed, 26 Aug 2009 13:43:23 GMT</pubDate><ttl>60</ttl><item><title>负载测试、压力测试和性能测试的异同 - 转</title><link>http://www.blogjava.net/bibi/archive/2009/08/26/292711.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Wed, 26 Aug 2009 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2009/08/26/292711.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/292711.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2009/08/26/292711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/292711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/292711.html</trackback:ping><description><![CDATA[负载测试（Load testing）、压力测试（Stress Test，应称为强度测试）和性能测试，这三个概念常常引起混淆，难以区分，从而造成不正确的理解和错误的使用。之前，也有不少讨论，比较有名的，应归为Grig Gheorghiu's的两篇博客：

Performance vs. load vs. stress testing More on performance vs. load testing负载测试、压力测试和性能测试的测试目的不同，但其手段和方法在一定程度上比较相似，通常会使用相同的测试环境和测试工具，而且都会监控系统所占用资源的情况以及其它相应的性能指标，这也是造成人们容易产生概念混淆的主要原因。

我们知道，软件总是运行在一定的环境下，这种环境包括支撑软件运行的软硬件环境和影响软件运行的外部条件。为了让客户使用软件系统感到满意，必须确保系统运行良好，达到高安全、高可靠和高性能。其中，系统是否具有高性能的运行特征，不仅取决于系统本身的设计和程序算法，而且取决于系统的运行环境。系统的运行环境会依赖于一些关键因素，例如：

系统架构，如分布式服务器集群还是集中式主机系统等。

硬件配置，如服务器的配置，CPU、内存等配置越高，系统的性能会越好。

网络带宽，随着带宽的提高，客户端访问服务器的速度会有较大的改善。

支撑软件的选定，如选定不同的数据库管理系统（Oracle、MySQL等）和web应用服务器（Tomcat、GlassFish、Jboss、WebLogic等），对应用系统的性能都有影响。

外部负载，同时有多少个用户连接、用户上载文件大小、数据库中的记录数等都会对系统的性能有影响。一般来说，系统负载越大，系统的性能会降低。

从上面可以看出，使系统的性能达到一个最好的状态，不仅通过对处在特定环境下的系统进行测试以完成相关的验证，而且往往要根据测试的结果，对系统的设计、代码和配置等进行调整，提高系统的性能。许多时候，系统性能的改善是测试、调整、再测试、再调整、……一个持续改进的过程，这就是我们经常说的性能调优（perormance tuning）。

在了解了这样一个背景之后，就比较容易理解为什么在性能测试中常常要谈负载测试。从测试的目的出发、从用户的需求出发，就比较容易区分性能测试、负载测试和压力测试。性能测试是为了获得系统在某种特定的条件下（包括特定的负载条件下）的性能指标数据，而负载测试、压力测试是为了发现软件系统中所存在的问题，包括性能瓶颈、内存泄漏等。通过负载测试，也是为了获得系统正常工作时所能承受的最大负载，这时负载测试就成为容量测试。通过压力测试，可以知道在什么极限情况下系统会崩溃、系统是否具有自我恢复性等，但更多的是为了确定系统的稳定性。

那么，如何给负载测试、压力测试下个定义呢？根据上述讨论，我们可以给出如下的定义：

负载测试是模拟实际软件系统所承受的负载条件的系统负荷，通过不断加载（如逐渐增加模拟用户的数量）或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源（如CPU、内存）等，以检验系统的行为和特性，以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。负载测试更多地体现了一种方法或一种技术。

压力测试是在强负载（大数据量、大量并发用户等）下的测试，查看应用系统在峰值使用情况下操作行为，从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间（如24小时以上）的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。

压力测试可以被看作是负载测试的一种，即高负载下的负载测试，或者说压力测试采用负载测试技术。通过压力测试，可以更快地发现内存泄漏问题，还可以更快地发现影响系统稳定性的问题。例如，在正常负载情况下，某些功能不能正常使用或系统出错的概率比较低，可能一个月只出现一次，但在高负载（压力测试）下，可能一天就出现，从而发现有缺陷的功能或其它系统问题。通过负载测试，可以证明这一点，某个电子商务网站的订单提交功能，在10个并发用户时错误率是零，在50个并发用户时错误率是1%，而在200个并发用户时错误率是20％。

负载测试是为了发现系统的性能问题，负载测试需要通过系统性能特性或行为来发现问题，从而为性能改进提供帮助，从这个意义看，负载测试可以看作性能测试的一部分。但它们两者的目的是不一样的，负载测试是为了发现缺陷，而性能测试是为了获取性能指标。因为性能测试过程中，也可以不调整负载，而是在同样负载情况下改变系统的结构、改变算法、改变硬件配置等等来得到性能指标数据，从这个意义看，负载测试可以看作是性能测试所c的一种技术，即性能测试使用负载测试的技术、使用负载测试的工具。性能测试要获得在不同的负载情况下的性能指标数据。

通过负载测试和压力测试都可以获得系统正常工作时的极限负载或最大容量。容量测试，自然也是采用负载测试技术来实现，而在破坏性的压力测试中，容量的确定可以看作是一种副产品——间接结果。

综合所述，负载测试、压力测试和性能测试的概念可以概括如下：

负载测试是通过改变系统负载方式、增加负载等来发现系统中所存在的性能问题。负载测试是一种测试方法，可以为性能测试、压力测试所采用。负载测试的加载方式也有很多种，可以根据测试需要来选择。

性能测试是为获取或验证系统性能指标而进行测试。多数情况下，性能测试会在不同负载情况下进行。

压力测试通常是在高负载情况下来对系统的稳定性进行测试，更有效地发现系统稳定性的隐患和系统在负载峰值的条件下功能隐患等。

<img src ="http://www.blogjava.net/bibi/aggbug/292711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2009-08-26 20:06 <a href="http://www.blogjava.net/bibi/archive/2009/08/26/292711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给Windows2003减肥</title><link>http://www.blogjava.net/bibi/archive/2008/10/11/233728.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Sat, 11 Oct 2008 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2008/10/11/233728.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/233728.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2008/10/11/233728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/233728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/233728.html</trackback:ping><description><![CDATA[　1、删除系统备份文件吧：开始→ 执行→sfc.exe /purgecache 能减去几M的空间，积少成多嘛。 <br />　<br />　2、删除驱动备份： %windows%\driver cache\i386目录下的driver.cab 档，通常这个档是70.3M。<br />　　<br />   3、删除\windows\ime下不用的输入法，8xM　　 　　<br /><br />    4、如果你不看系统的帮助的话...删除%windows%\help目 录下的所以文件，36M。<br />　　 　　<br />   5、关闭系统还原，右健单击“我的计算机”，选择“内容”，找到“系统还原”，选择“在所有驱动器上关闭 系统还原”。<br />　　 　　<br />   6、如果你的系统区空间实在紧张，可以考虑把IE流览器的临时文件夹移动到其它分区，方法：点击IE，工具》Internet 选项》Internet临时文件》设定》移动活页夹 就O.K了 　　<br /><br />   7、如果空间再紧张的话，启用NTFS的压缩功能，建议不使用！<br />　　 　　<br />    8、卸载 不常用的组件，WIN2K3和以前的WINDOWS版本不同，安装全部由系统自己负责，用户无法选择安装需要的组件。执行“添加-删除程序”，删除 掉游戏，壁纸等不用的附件。还有记住删除Internet Explorer 增强的安全配置，要不流览网页时总会弹出警告！还可以用记事本修改\% windows%\inf\sysoc.inf，用查找/替换功能，在查找框中输入,hide，全部替换为空(注意,这行中的,hide不能替换的 "netfx=netfxocm.dll,UrtOcmProc,netfxocm.inf,hide,7")。这样，就把所有的,hide都去掉了，存盘退出，执行“添加-删除程序”，就会看 见“添加/删除 Windows 组件”中多出不少选项,但和XP下不同,改完后虽然隐藏的都出来了,但只有 Windows自动更新一项可以删除,其它的是 不允许删除滴~~　 <br /><br />============================================== <br /><br />1.删除C:\WINDOWS\PCHEALTH\ERRORREP\UserDumps中所有文件,400多M,这些文件就是系统出错时自动产生的一种记录出错时系统状态的日志文件。 <br /><br />2.删除所有C:\WINDOWS\$*$文件,都是些系统升级备份文件,800多M. <br /><br />3.将C:\WINDOWS\SoftwareDistribution\Download所有文件打包后删除,移到其他大的分区的备份目录下面.这个文件夹的东东可以用来以后装系统的时候直接复制到新系统的该目录,系统升级时不用重新从微软下补丁了.节省500多M. <br /><br />4.将C:\WINDOWS\ServicePackFiles文件夹所有文件移动到移到其他大的分区的备份目录下面, 修改注册表的键值,将这个键值定义到修改的路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\ ServicePackSourcePath.这个目录的所有文件是用来还原Service Pack的.586M <br /><br />5.删除C:\WINDOWS\Driver Cache\i386,这些文件都是Windows操作系统自带的已知硬件驱动文件. <br /><br />6.删除C:\Documents and Settings\huangxianglong\Local Settings\Temp 400多M <br /><br />7.关闭OUTLOOK2003,将其数据文件转移到大分区,然后重启OUTLOOK2003,将其数据和本文文件夹指向新路径即可,节省了我C区1G的空间.<br /> <br />8.将My Document的路径指向大分区某个文件夹. <img src ="http://www.blogjava.net/bibi/aggbug/233728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2008-10-11 12:59 <a href="http://www.blogjava.net/bibi/archive/2008/10/11/233728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10G -- Pl/sql 基础</title><link>http://www.blogjava.net/bibi/archive/2006/08/21/64890.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Mon, 21 Aug 2006 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2006/08/21/64890.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/64890.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2006/08/21/64890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/64890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/64890.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 块与变量&nbsp;&nbsp;<a href='http://www.blogjava.net/bibi/archive/2006/08/21/64890.html'>阅读全文</a><img src ="http://www.blogjava.net/bibi/aggbug/64890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2006-08-21 21:39 <a href="http://www.blogjava.net/bibi/archive/2006/08/21/64890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在WINXP HOME版下安装ROSE SUITE 2003及退出错误补丁</title><link>http://www.blogjava.net/bibi/archive/2006/06/09/51691.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Fri, 09 Jun 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2006/06/09/51691.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/51691.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2006/06/09/51691.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/51691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/51691.html</trackback:ping><description><![CDATA[
		<p>下载<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&amp;displaylang=en"><br />http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&amp;displaylang=en</a><br />安装完后再安装/bin/Orca.msi</p>
		<p>然后用orca打开rose.msi，删除(VersionNT AND (NOT RSWINXPHOME))OR (DISABLE_PLATFORM_BLOCKS = 1)即可。<br /><br /></p>
		<p>
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text2006212" style="FONT-SIZE: 12px">另外错误：<br />应用rational rose 后退出时报错："MEM_BAD_POINTER"<br /><br />解决办法：<br />1) extract shw32.dll from the attached zip file.<br /><br />2) locate the copy of shw32.dll that the affected program (the one<br />that's giving the MEM_BAD_POINTER error) is using. Rename this file,<br />or move it to some other directory for safe keeping. Note: this step<br />is not strictly necessary, BUT if you experience problems with our<br />new DLL, the first thing we're going to suggest is that you revert to<br />your old one.<br /><br />3) with your old shw32.dll renamed or moved for safe keeping, install<br />the new shw32.dll where the old one used to be. Now run your app as<br />usual and verify that the error no longer appears.<br /><br />4) if after step 3 you still see the MEM_BAD_POINTER error, search<br />your hard drives for any other occurrences of shw32.dll and replace<br />those (using the above procedures), one at a time, until the error no<br />longer appears.<br /><br /><a class="" title="rose pack" href="/Files/bibi/94_016363_1102062135.zip" target="">下载补丁</a></span>
				</font>
		</p>
<img src ="http://www.blogjava.net/bibi/aggbug/51691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2006-06-09 15:10 <a href="http://www.blogjava.net/bibi/archive/2006/06/09/51691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Leadership and Outsourcing Project Management -- mIchael</title><link>http://www.blogjava.net/bibi/archive/2006/03/03/33501.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Fri, 03 Mar 2006 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2006/03/03/33501.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/33501.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2006/03/03/33501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/33501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/33501.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有序，组员分工明确，能按计划提交高品质的项目产出的小组 <br>小组以任务为导向，无职务高低之区分，仅仅是任务分工不同 <br>有着一致的目标：在既定时辰内完成客户满意的工作产出 <br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bibi/archive/2006/03/03/33501.html'>阅读全文</a><img src ="http://www.blogjava.net/bibi/aggbug/33501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2006-03-03 17:07 <a href="http://www.blogjava.net/bibi/archive/2006/03/03/33501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三步搞定!水货商坦言IBM本本验货指南</title><link>http://www.blogjava.net/bibi/archive/2006/02/13/30397.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Sun, 12 Feb 2006 17:42:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2006/02/13/30397.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/30397.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2006/02/13/30397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/30397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/30397.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="92%" border=0>
<TBODY>
<TR>
<TD vAlign=top align=left height=10></TD></TR>
<TR>
<TD class=font14 align=left>
<P aling="left"><B>第1页：对照IBM的装箱单核对包装箱内物品</B></P></TD></TR></TBODY></TABLE><BR>一般情况下IBM随包装箱会放一张装箱单，这个东西现在一般机器都不带，没有多大用处，也难免香港人会把它扔掉，在他们看来除了机器，别的都无所谓。单子上会列出包装箱内的所有附件。 
<P></P>
<P align=center><A href="http://www.pcpop.com/doc/App/ImageShow.aspx?category=article&amp;sn=000170359" target=_blank><IMG style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: black; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: black; BORDER-TOP-COLOR: black; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: black" alt=三步搞定!水货商坦言IBM本本验货指南 src="http://img2.pcpop.com/ArticleImages/400x300/0/170/000170359.jpg" border=1></A></P>
<P align=left>&nbsp;&nbsp;&nbsp; 1、机器一台</P>
<P>　2、电池一块 注意:按行货的装相方法，电池和机器是分开的，因为香港人拿到机器要先验屏有无坏点， 所以电池就装在机器上了。</P>
<P>　3、适配器一套3头为英制，香港货和新加坡货都是这种。2头为美制，美国货是这样的。</P>
<P>　4、电话线一根，接猫上网的，现在很少人用了。</P>
<P>　5、说明书一套。多数均为T40版的，猜测是IBM为了节约成本，所以T40，T41，T42，T43都用同一套说明书。</P>
<P>　6、小红帽两个。为将来原配的脏了更换的。</P>
<P>　7、固定螺丝一颗用来固定互换光区的，防止别人插拔。<BR><BR></P>
<P aling="left"><B>第2页：检查外观、验证SN号</B></P>
<P>&nbsp;&nbsp;&nbsp; 接下来就要看外观了，有没有划伤，毕竟外观也是很重要的，要检查外观有无硬商如果有及时更换。特别要注意平时不太注意的细节，比如机器底部、<A class=keyword href="http://product.pcpop.com/Keyboard/00000_1.html" target=_blank>键盘</A>还有屏幕。 </P>
<P></P>
<DIV align=center><A href="http://product.pcpop.com/000002570/Picture/000037318.html" target=_blank><IMG style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: black; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: black; BORDER-TOP-COLOR: black; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: black" alt=三步搞定!水货商坦言IBM本本验货指南 src="http://img2.pcpop.com/ProductImages/Big/0/37/000037318.jpg" border=1></A></DIV>
<P>&nbsp;　开机进BIOS，先查看机器大概的配置，主频，<A class=keyword href="http://product.pcpop.com/Memory/00000_1.html" target=_blank>内存</A>，还有关键的两个号码，SN号和UUID号码。SN号是机器唯一的序列号，没有重复的，从BIOS里查到的SN号要和包装箱的，机器背面的，还有用测试软件测出来的都对上，才算完整。</P>
<P>　UUID号码是<A class=keyword href="http://product.pcpop.com/MB/00000_1.html" target=_blank>主板</A>序列号。只显示在BIOS里和包装箱上，这两处也要对上。另外要和用测试软件测出的UUID号也对上。如果机器<A class=keyword href="http://product.pcpop.com/MB/00000_1.html" target=_blank>主板</A>被动过，那UUID号是会改变的。<BR><BR></P>
<P aling="left"><B>第3页：检查屏幕、电池和保修</B></P>
<P>　开始进入系统，测试屏幕，可以用专业的测试软件，网上有很多像Nokia的软件等等，主要检查坏点和亮点。 </P>
<P></P>
<DIV align=center><A href="http://product.pcpop.com/000013450/Picture/000058508.html" target=_blank><IMG style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: black; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: black; BORDER-TOP-COLOR: black; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: black" alt=三步搞定!水货商坦言IBM本本验货指南 src="http://img2.pcpop.com/ProductImages/Big/0/58/000058508.jpg" border=1></A></DIV>
<P>&nbsp;&nbsp;&nbsp; 查看电池充电次数，一般来说，不超过两次。如果是旧电池的，这一步是逃不过去的，而且以目前的技术，还没有哪个高手可以刷新充电次数</P>
<P>&nbsp;&nbsp;&nbsp; 一定要上网查询保修期限和核对附件的编号</P>
<P>&nbsp;&nbsp;&nbsp; 具体网址：<A href="http://www-3.ibm.com/pc/support/site.wss/warranty/warranty.vm">http://www-3.ibm.com/pc/support/site.wss/warranty/warranty.vm</A>&nbsp;</P>
<DIV align=center><A href="http://www.pcpop.com/doc/App/ImageShow.aspx?category=article&amp;sn=000170360" target=_blank><IMG style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: black; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: black; BORDER-TOP-COLOR: black; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: black" alt=三步搞定!水货商坦言IBM本本验货指南 src="http://img2.pcpop.com/ArticleImages/400x300/0/170/000170360.jpg" border=1></A></DIV>
<P>&nbsp; 在TYPE一栏中输入机器型号，如2373在Serial#一栏中输入机器SN号，然后点Continue，或者点击开会出现保修信息。</P>
<DIV align=center><A href="http://www.pcpop.com/doc/App/ImageShow.aspx?category=article&amp;sn=000170361" target=_blank></A></DIV>
<DIV align=center><A href="http://www.pcpop.com/doc/App/ImageShow.aspx?category=article&amp;sn=000170598" target=_blank><IMG style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: black; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: black; BORDER-TOP-COLOR: black; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: black" alt=三步搞定!水货商坦言IBM本本验货指南 src="http://img2.pcpop.com/ArticleImages/400x300/0/170/000170598.jpg" border=1></A></DIV>
<P>&nbsp;&nbsp;&nbsp; 有本机器的保修期限和销售地。</P>
<P>&nbsp;&nbsp;&nbsp; 特别说明：因为过海关是机器和包装箱分开过的，然后到深圳再一对一的装箱，难免适配器和电话线装错，有可能造成这两个部件的号码和网站显示号码难以对上。除此之外，机器的<A class=keyword href="http://product.pcpop.com/HDD/00000_1.html" target=_blank>硬盘</A>编号，电池编号等等都是能对上的。另外次编号是IBM为自己的配件所做的出厂编号，很多测试软件是测不出来的。最后一点检查是否带有COA标 。<BR></P><img src ="http://www.blogjava.net/bibi/aggbug/30397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2006-02-13 01:42 <a href="http://www.blogjava.net/bibi/archive/2006/02/13/30397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to hold effective meeting? </title><link>http://www.blogjava.net/bibi/archive/2005/12/07/22841.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Wed, 07 Dec 2005 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/12/07/22841.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/22841.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/12/07/22841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/22841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/22841.html</trackback:ping><description><![CDATA[Meeting,Meeting,日常工作有各种会议需要参加，如何让会议更加有意义，更加高效？

<IMG src="http://img174.photo.163.com/bibi_ye/23032252/581532208.jpg" width=1697 height=467>

end img<img src ="http://www.blogjava.net/bibi/aggbug/22841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-12-07 12:32 <a href="http://www.blogjava.net/bibi/archive/2005/12/07/22841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结合水晶报表工具，能做出这样的报表来吗？</title><link>http://www.blogjava.net/bibi/archive/2005/11/25/21442.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Fri, 25 Nov 2005 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/11/25/21442.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/21442.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/11/25/21442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/21442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/21442.html</trackback:ping><description><![CDATA[下图中，轮船上面的方格子（Y）是代表每座集装箱的数量，轮船的底座是表示有多少座的集装箱。<BR><BR><IMG height=297 alt=o_ship.JPG src="http://www.blogjava.net/images/blogjava_net/bibi/4653/o_ship.JPG" width=626 border=0><BR><BR><BR>关键应该在于，如何在水晶报表中加上轮船形状和方格子的图案。<BR>1）从水晶报表内置的图形报表入手，但我查看了水晶报表的安装目录，没有找到图形报表的image图。<BR>2）把船的图形做为水晶报表内置的图形报表的背景，放在C:\Program Files\Common Files\Microsoft Shared\Clipart\cagcat50中，并另存为：test.WMF。但WMF还得探究一下。<BR><BR>不知哪位朋友有这方面的经验，恳请赐教！<img src ="http://www.blogjava.net/bibi/aggbug/21442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-11-25 16:58 <a href="http://www.blogjava.net/bibi/archive/2005/11/25/21442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>水晶报表系列文章--在Web 上打印水晶报表的四种方法</title><link>http://www.blogjava.net/bibi/archive/2005/11/25/21428.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Fri, 25 Nov 2005 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/11/25/21428.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/21428.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/11/25/21428.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/21428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/21428.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/bibi/archive/2005/11/25/21428.html'>阅读全文</a><img src ="http://www.blogjava.net/bibi/aggbug/21428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-11-25 15:02 <a href="http://www.blogjava.net/bibi/archive/2005/11/25/21428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>水晶报表系列文章-- Java 支持概览及技术白皮书资源 xi版本下载地址</title><link>http://www.blogjava.net/bibi/archive/2005/11/24/21283.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Thu, 24 Nov 2005 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/11/24/21283.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/21283.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/11/24/21283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/21283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/21283.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/bibi/archive/2005/11/24/21283.html'>阅读全文</a><img src ="http://www.blogjava.net/bibi/aggbug/21283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-11-24 14:48 <a href="http://www.blogjava.net/bibi/archive/2005/11/24/21283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10G 下载地址</title><link>http://www.blogjava.net/bibi/archive/2005/11/23/21126.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Wed, 23 Nov 2005 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/11/23/21126.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/21126.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/11/23/21126.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/21126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/21126.html</trackback:ping><description><![CDATA[Oracle Application Server 10g Release 2:<A href="http://download-west.oracle.com/otn/nt/ias/101202/as_windows_x86_101202_disk1.zip"><BR>http://download-west.oracle.com/otn/nt/ias/101202/as_windows_x86_101202_disk1.zip</A>&nbsp;<BR><A href="http://download-west.oracle.com/otn/nt/ias/101202/as_windows_x86_101202_disk2.zip">http://download-west.oracle.com/otn/nt/ias/101202/as_windows_x86_101202_disk2.zip</A><BR><A href="http://download-west.oracle.com/otn/nt/ias/101202/as_windows_x86_101202_disk3.zip">http://download-west.oracle.com/otn/nt/ias/101202/as_windows_x86_101202_disk3.zip</A><BR><BR><SPAN class=topstoryhead>Oracle Database 10<I>g</I> Release 2 (10.2.0.1.0) </SPAN><BR><A href="http://download-west.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip">http://download-west.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip</A><img src ="http://www.blogjava.net/bibi/aggbug/21126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-11-23 14:57 <a href="http://www.blogjava.net/bibi/archive/2005/11/23/21126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL 学习笔记 —— 中级篇</title><link>http://www.blogjava.net/bibi/archive/2005/11/16/20096.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Wed, 16 Nov 2005 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/11/16/20096.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/20096.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/11/16/20096.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/20096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/20096.html</trackback:ping><description><![CDATA[<P><STRONG>一、<FONT size=4>XSL的运算符</FONT></STRONG></P>
<P>表一、运算符与特殊字符</P>
<TABLE style="FONT-SIZE: 12px" cellSpacing=0 cellPadding=0 width=500 align=center border=0>
<TBODY>
<TR>
<TD width=67 bgColor=#666666 height=25>&nbsp;<FONT color=#ffffff>运算符</FONT></TD>
<TD width=10 bgColor=#000000 height=25></TD>
<TD width=427 bgColor=#000000><FONT color=#ffffff>描述</FONT></TD></TR>
<TR>
<TD width=67 bgColor=#eeeeee height=35>
<DIV align=center>/</DIV></TD>
<TD width=10 bgColor=#cccccc height=35></TD>
<TD width=427 bgColor=#cccccc>选择子元素，返回左侧元素的直接子元素；如果"/"位于最左侧表示选择根结点的直接子元素</TD></TR>
<TR bgColor=#f0f0f0>
<TD width=67 height=35>
<DIV align=center>//</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=427 bgColor=#eeeeee>递归下降，不论深度，搜索指定的元素；如果位于最左侧表示从根结点出发递归下降搜索指定元素</TD></TR>
<TR>
<TD width=67 bgColor=#eeeeee height=35>
<DIV align=center><B><FONT face="Verdana, Arial, Helvetica, sans-serif">.</FONT></B></DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=427 bgColor=#cccccc>表示当前元素</TD></TR>
<TR bgColor=#f0f0f0>
<TD width=67 height=35>
<DIV align=center>*</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=427 bgColor=#eeeeee>通配符，选择任意元素，不考虑名字</TD></TR>
<TR>
<TD width=67 bgColor=#eeeeee height=35>
<DIV align=center>@</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=427 bgColor=#cccccc>
<P></P>
<P>取得属性值，作为属性名的前缀</P></TD></TR>
<TR bgColor=#f0f0f0>
<TD width=67 height=35>
<DIV align=center>@*</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=427 bgColor=#eeeeee>
<P></P>
<P>通配符，选择任意属性，不考虑名字</P></TD></TR>
<TR>
<TD width=67 bgColor=#eeeeee height=35>
<DIV align=center><FONT face="Verdana, Arial, Helvetica, sans-serif"><B>:</B></FONT></DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=427 bgColor=#cccccc>名字作用范围分隔符，将名字作用范围前缀与元素或属性名分隔开来</TD></TR>
<TR bgColor=#f0f0f0>
<TD width=67 height=35>
<DIV align=center><FONT face="Verdana, Arial, Helvetica, sans-serif"><B>!*</B></FONT></DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=427 bgColor=#eeeeee>在相关节点上应用指定方法</TD></TR>
<TR>
<TD width=67 bgColor=#eeeeee height=35>
<DIV align=center>()*</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=427 bgColor=#cccccc>分组，明确指定优先顺序</TD></TR>
<TR bgColor=#f0f0f0>
<TD width=67 height=35>
<DIV align=center>[]</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=427 bgColor=#eeeeee>应用过滤样式</TD></TR>
<TR>
<TD width=67 bgColor=#eeeeee height=35>
<DIV align=center>[]*</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=427 bgColor=#cccccc>下标运算符，用于在集合中指示元素</TD></TR></TBODY></TABLE>
<P>　　表二、逻辑运算符</P>
<TABLE style="FONT-SIZE: 12px" cellSpacing=0 cellPadding=0 width=500 align=center border=0>
<TBODY>
<TR>
<TD width=114 bgColor=#666666 height=25>&nbsp;<FONT color=#ffffff>可选方式</FONT></TD>
<TD width=10 bgColor=#000000 height=25></TD>
<TD width=368 bgColor=#000000><FONT color=#ffffff>描述</FONT></TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>and $and$ 或 &amp;&amp;</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>逻辑与</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>or $or$ 或 ||</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>逻辑或</TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>not() $not$</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>逻辑非</TD></TR></TBODY></TABLE>
<P>　　表三、关系运算符<BR></P>
<TABLE style="FONT-SIZE: 12px" cellSpacing=0 cellPadding=0 width=500 align=center border=0>
<TBODY>
<TR>
<TD width=114 bgColor=#666666 height=25>&nbsp;<FONT color=#ffffff>可选方式</FONT></TD>
<TD width=10 bgColor=#000000 height=25></TD>
<TD width=368 bgColor=#000000><FONT color=#ffffff>描述</FONT></TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>= 或 $eq$</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>相等</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>= 或 $ieq$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>相等（不区分大小写）</TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>!= 或 $ne$</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>不等</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>$ine$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>不等（不区分大小写）</TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>&lt; 或 $lt$ </DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>小于</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>$ilt$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>小于（不区分大小写）</TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>&lt;= 或 $le$</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>小于等于</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>$ile$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>小于等于（不区分大小写）</TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>&gt; 或 $gt$ </DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>大于</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>$igt$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>大于（不区分大小写）</TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>&gt;= 或 $ge$</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>大于等于</TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>$ige$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>大于等于（不区分大小写） </TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>$all$ </DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>集合运算符，如果集合中所有项目均满足条件则返回"真" </TD></TR>
<TR>
<TD width=114 bgColor=#f0f0f0 height=25>
<DIV align=center>$any$</DIV></TD>
<TD width=10 bgColor=#eeeeee height=25></TD>
<TD width=368 bgColor=#eeeeee height=25>集合运算符，如果集合中任意项目满足条件则返回"真" </TD></TR>
<TR>
<TD width=114 bgColor=#eeeeee height=25>
<DIV align=center>|</DIV></TD>
<TD width=10 bgColor=#cccccc height=25></TD>
<TD width=368 bgColor=#cccccc height=25>集合运算符，返回两个集合的联合</TD></TR></TBODY></TABLE><BR><STRONG>二、&nbsp;脚本与XSL的结合及应用<BR></STRONG>
<P>&lt;xsl:eval&gt;含义：计算脚本表达式，输出一个文本字符串。<BR>语法：<BR>&lt;xsl:eval language="language-name"&gt;<BR>　　属性：<BR>　　language ── 规定所用脚本语言的名字，可用的属性有"JavaScript"、"JScript"、"VBScript"、"VBS"等，缺省为"JScript"。</P>
<P>&lt;xsl:script&gt;含义：声明全局变量或定义函数。<BR>　　语法：<BR>&lt;xsl:script language="language-name"&gt;<BR>　　属性：同&lt;xsl:eval&gt;<BR><BR>例如：<BR>&lt;TR&gt;&lt;TD&gt;小计&lt;/TD&gt;<BR>&lt;TD&gt;&lt;xsl:eval&gt;total(this,"q1")&lt;/xsl:eval&gt;&lt;/TD&gt;<BR>&lt;TD&gt;&lt;xsl:eval&gt;total(this,"q2")&lt;/xsl:eval&gt;&lt;/TD&gt;<BR>&lt;TD&gt;&lt;xsl:eval&gt;total(this,"q3")&lt;/xsl:eval&gt;&lt;/TD&gt;<BR>&lt;TD&gt;&lt;xsl:eval&gt;total(this,"q4")&lt;/xsl:eval&gt;&lt;/TD&gt;<BR>&lt;/TR&gt;<BR>&lt;/TABLE&gt;</P>
<P>&lt;xsl:script&gt;<BR>function total(node,q)<BR>{<BR>　　temp=0; <BR>　　mark='/document/report/'+q;<BR>　　v=node.selectNodes(mark);<BR>　　for(t=v.nextNode();t;t=v.nextNode())<BR>　　{<BR>　　　　temp+=Number(t.text);<BR>　　}<BR>　　return temp; //小计值<BR>}<BR>&lt;/xsl:script&gt;<BR>selectNodes() ── 是XMLDOMObject的一个方法，返回文档中所有满足条件的结点的集合，条件与&lt; xsl:for-each &gt;和select属性的取值采用同样的写法，可以加筛选、下标等限制。</P><BR><FONT size=4><STRONG>三、XSL函数</STRONG><BR><BR><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、end()<BR></FONT>　　含义：返回集合中最后一个元素。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、index()<BR>　　含义：返回该元素在集合中的位置，返回值是一整数，其中第一个元素返回0。<BR><BR><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、nodeName()<BR></FONT>　　含义：返回元素的名字，即标记名。<BR>　　示例：选择任意元素，假如其名字（即标记名）等于"name"：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *[nodeName()='name'] 或 *[name]<BR><BR><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、number()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>含义：将值转换为数值形式，如果不是数值则返回空，要求参数。<BR>　　示例：年龄(age)小于30岁的人的简历(resume)：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resume[number(age)$lt$30] 或 resume[age$lt$30]<BR><BR><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、nodeType()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>含义：返回结点类型，结果为是数值。以下是返回值列表：<BR><BR>
<TABLE style="FONT-SIZE: 12px" cellSpacing=1 cellPadding=0 width=500 align=center border=0>
<TBODY>
<TR>
<TD width=209 bgColor=#000000 height=25><FONT color=#ffffff>&nbsp;结点类型</FONT></TD>
<TD width=85 bgColor=#000000><FONT color=#ffffff>&nbsp;结点类型值</FONT></TD>
<TD width=202 bgColor=#000000><FONT color=#ffffff>&nbsp;结点的字符形式描述</FONT></TD></TR>
<TR>
<TD width=209 bgColor=#cccccc height=25>&nbsp;Element</TD>
<TD width=85 bgColor=#cccccc>&nbsp;1</TD>
<TD width=202 bgColor=#cccccc>&nbsp;'element'</TD></TR>
<TR>
<TD width=209 bgColor=#eeeeee height=25>&nbsp;Element Attribute</TD>
<TD width=85 bgColor=#eeeeee>&nbsp;2</TD>
<TD width=202 bgColor=#eeeeee>&nbsp;'attribute'</TD></TR>
<TR bgColor=#cccccc>
<TD width=209 height=25>&nbsp;Markup-Delimited Region of Text</TD>
<TD width=85>&nbsp;3</TD>
<TD width=202>&nbsp;'text'</TD></TR>
<TR>
<TD width=209 bgColor=#eeeeee height=25>&nbsp;Processing Instruction</TD>
<TD width=85 bgColor=#eeeeee>&nbsp;7</TD>
<TD width=202 bgColor=#eeeeee>&nbsp;'processing_instruction'</TD></TR>
<TR bgColor=#cccccc>
<TD width=209 height=25>&nbsp;Comment</TD>
<TD width=85>&nbsp;8</TD>
<TD width=202>&nbsp;'comment'</TD></TR>
<TR>
<TD width=209 bgColor=#eeeeee height=25>&nbsp;Document Entity</TD>
<TD width=85 bgColor=#eeeeee>&nbsp;9</TD>
<TD width=202 bgColor=#eeeeee>&nbsp;'document'</TD></TR></TBODY></TABLE>
<P>　　6、value()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含义：返回元素或属性的值。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例：value()是元素或属性的缺省方法，以下表示是等价：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name!value()="NAME" 与 name="NAME"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @attr="attribute_value" 与 @attr="attribute_value"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：@是属性前缀，@attr表示是属性attr<BR><BR>　　7、attribute()<BR>　　含义：返回所有属性结点的集合，等价于"@*"。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例：寻找所有的resume元素，满足条件至少有一个属性的值为"ABC"：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resume[$any$attribute()='ABC'] 或 resume[$any$@*='ABC']<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 寻找所有的resume元素，满足条件至少有一个子元素有一个属性的值为"ABC"： <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resume[$any$*/attribute()='ABC'] 或 resume[$any$*/@*='ABC']<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、comment()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含义：返回所有注释结点。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resume[$any$comment()='禹希初的简历']<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示寻找含有注释语句：&lt;!--禹希初的简历--&gt;的&lt;resume&gt;元素。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、cdata()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含义：返回所有CDATA类型的结点的集合。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例：resume[$any$cdata()='禹希初的简历']<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示寻找含有下述语句（必须是直接子结点）&lt;![CDATA[禹希初的简历]]&gt;的&lt;resume&gt;元&nbsp;&nbsp; 素。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、node()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含义：返回当前上下文环境中除根结点和属性结点以外的所有结点的集合，等价于：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*|pi()|comment()|text()"</P>
<P>　　示例：寻找所有元素resume，其最后一个结点的名字为"skill"：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resume[node()[end()]!nodeName()='skill'] <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 寻找所有resume元素的第一个结点：resume/node()[0]。</P>
<P>　　11、textnode()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含义：返回所有文本类型的结点的集合。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例：寻找每一个p元素的第二个文本结点：p/textnode(1) 或 p!textnode(1)</P>
<P>　　12、text()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含义：返回所有表示文本字符串的结点的集合，等价于"cdata()|textnode()"。<BR><BR>13、absoluteChildNumber <BR>　　含义：返回结点相对于它所有的兄弟（不论名字是否相同）的序号。<BR>　　语法：absoluteChildNumber(node)<BR>　　参数：node ── 对象，欲返回编号的结点。<BR>　　示例：<BR>　　1、假定文档结构为：&lt;document&gt;&lt;head/&gt;&lt;body/&gt;&lt;/document&gt;，其中document为顶层结点，下述表达式将输出：<BR>&nbsp;&nbsp;&lt;xsl:eval&gt;<BR>&nbsp;&nbsp;absoluteChildNumber(this.selectNodes('/document/body').item(0))<BR>&nbsp;&nbsp;&lt;/xsl:eval&gt;<BR>　　2、确定当前结点相对于其所有兄弟的序号：<BR>&nbsp;&nbsp;&lt;xsl:eval&gt;<BR>&nbsp;&nbsp;absoluteChildNumber(this)<BR>&nbsp;&nbsp;&lt;/xsl:eval&gt;</P>
<P>14、ancestorChildNumber<BR>　　含义：从给定结点出发根据给定祖先结点名返回最近的祖先结点的序号（相对于同名结点）。如果找不祖先，则返回0。<BR>　　语法：ancestorChildNumber(bstrNodeName, pNode)<BR>　　参数：<BR>　　bstrNodeName ── 字符串。被搜索的祖先结点的名字。<BR>　　pNode ── 对象。搜索开始位置的结点。<BR>　　示例查找当前结点最近的名为report祖先结点：<BR>&nbsp;&nbsp;ancestorChildNumber('report',this)</P>
<P>15、attributes<BR>　　含义：返回结点属性的集合。<BR>　　语法：object.attributes<BR>　　参数：object ── 结点对象。<BR>　　示例：当前结点属性的个数<BR>&nbsp;&nbsp;this.attributes.length<BR>　　当前结点第三个属性的值this.attributs.item(2).value或this.attributes.item(2).text或this.attributes(2).text<BR>　　注意：如果给定的下标大于属性总和减1将出错，第一个属性的下标是0。</P>
<P>16、baseName<BR>　　含义：返回有名字空间限制的基本名，即不包括名字前缀。<BR>　　语法：object.baseName<BR>　　参数：object ── 结点对象<BR>　　示例，当前结点的基本名：this.baseName</P>
<P>17、childNumber<BR>　　含义：返回结点相对于同名同胞的序号。<BR>　　语法：childNumber(object)<BR>　　参数：object ── 结点对象<BR>　　示例，假定XML文档结构如下：&lt;x&gt;&lt;y&gt;&lt;z&gt;&lt;/z&gt;&lt;/y&gt;&lt;/x&gt;<BR>　　如果当前结点是z，则childNumber(this)返回1，而absoluteChildNumber(this)返回3。 </P>
<P>18、dataType<BR>　　含义：设定或读取结点的数据类型。<BR>　　语法：设定结点的数据类型 object.dataType=objValue<BR>　　　　　读取结点的数据类型 objValue=object.dataType<BR>　　参数：object ── 结点对象。<BR>　　示例，读取当前结点的数据类型：dtType=this.dataType</P>
<P>19、depth<BR>　　含义：指定结点出现在文档树上的深度，即该结点位于文档第几层，顶层结点位于第一层，根结点（即用"/"表示的结点）位于第0层。<BR>　　语法：depth(pNode)<BR>　　参数：pNode ── 结点对象<BR>　　示例，当前结点的深度：depth(this)</P>
<P>20、firstChild、lastChild<BR>　　含义：返回结点的第一个子结点（或最后一个子结点）。<BR>　　语法：pNode.firstChild<BR>　　　　　pNode.lastChild<BR>　　参数：pNode ── 结点对象<BR>　　示例，当前结点的第一个结点的名字：this.firstChild.nodeName</P>
<P>21、formatIndex<BR>　　含义：用指定的计数系统格式化提供的整数。<BR>　　语法：formatIndex(lIndex, bstrFormat)<BR>　　参数：<BR>　　lIndex ── 整型数值或变量<BR>　　bstrFormat ── 数据格式，可选值有a、A、i、I、1、01（以0打头的数值形式，如果要求固定长度的编号如0001、0002则非常有用）。<BR>　　示例，当前结点的大写罗马数字编号：formatIndex(childNumber(this),'I')</P>
<P>22、formatNumber<BR>　　含义：以指定格式输出数值。<BR>　　语法：formatNumber(dblNumber, bstrFormat)<BR>　　参数：说明同formatNumber，不同之处在于格式化的可以是小数。<BR>　　示例，对变量a的值格式化为两位小数：formatNumber(a,'#.00')：</P>
<P>23、hasChildNodes<BR>　　含义：如果结点有子结点则返回true（-1），否则为false（0）。<BR>　　语法：pNode.hasChildNodes()<BR>　　注意：与此前介绍的函数不同，此函数后必须带一个空括号。<BR>　　示例，判断当前结点是否有子结点：this.hasChildNodes</P>
<P>24、namespaceURI、prefix<BR>　　含义：返回结点名字空间的全局资源标识符（或前缀）。<BR>　　语法：pNode.namespaceURI　　　　　pNode.prifix</P>
<P>25、nextSibling、previousSibling、parentNode<BR>　　含义：返回结点的下一个兄弟（或前一个兄弟、或结点的父结点）。<BR>　　语法：pNode.nextSibling　　pNode.previousSibling　　pNode.parentNode<BR>　　注意：对根结点（即"/"）应用parentNode方法、对第一个孩子结点应用previousSibling方法、对最后一个孩子结点应用nextSibling方法均会导致错误，可通过此过关系运算符==（等于）和!=（不等于）来判断一个结点是否某一指定结点，格式为pNode1 = pNode2或pNode2 != pNode2。<BR>　　十四、nodeName<BR>　　含义：返回元素、属性、入口的名字或其他类型结点的一个特定字符串。<BR>　　语法：pNode.nodeName<BR>　　示例，当前结点的名字：this.nodeName</P>
<P>26、nodeType、NodeTypeString<BR>　　含义：返回结点的类型的数值形式（或字符串形式）。<BR>　　语法：pNode.nodeType 或 pNode.nodeTypeString<BR>&nbsp;&nbsp;返回值：<BR>&nbsp;&nbsp;结点类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结点类型值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结点的字符形式描述 <BR>&nbsp;&nbsp;Element&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'element' <BR>&nbsp;&nbsp;Element Attribute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'attribute' <BR>&nbsp;&nbsp;Markup-Delimited &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 <BR>&nbsp;&nbsp;Region of Text&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'text' <BR>&nbsp;&nbsp;Processing Instruction&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'processing_instruction' <BR>&nbsp;&nbsp;Comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'comment' <BR>&nbsp;&nbsp;Document Entity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'document' </P>
<P>27、nodeTypedValue<BR>　　含义：以结点预定义的数据类型返回结点的值。<BR>　　语法：pNode.nodeTypedValue<BR>　　示例，假定当前结点的数据类型是fixed.14.4，下例将以数值返回结点的值，而不是文本一个字符串：<BR>&nbsp;&nbsp;this.nodeTypedValue</P>
<P>28、nodeValue<BR>　　含义：返回结点的文本。<BR>　　语法：pNode.nodeValue<BR>　　注意：该方法不用于元素类结点，可用于属性、CDATA、注释、文本等结点。<BR>　　示例，当前元素第一个属性的值：this.attributes(0).nodeValue<BR>　　当前元素内的文本（假定该元素内只有文本，无其它元素，即&lt;mark&gt;text&lt;/mark&gt;，建议多尝几次掌握其确切的用法）。<BR>&nbsp;&nbsp;this.firstChild.nodeValue</P>
<P>29、ownerDocument<BR>　　含义：返回包含该结点的文档的根。<BR>　　语法：pNode.ownerDocument<BR>　　注意：该方法用于文档的根结点将出错。</P>
<P>30、selectNodes<BR>　　含义：给定的样式匹配应用于当前结点并返回匹配的结点集合。<BR>　　语法：pNode.selectNodes('pattern')<BR>　　提示：pattern的编写与&lt;xsl:for-each&gt;的select属性的值类似，其中以"/"开头表示从文档的根出发搜索；以"//"开头表遍历文档的所有结点；以".."开头表示从当前结点的父结点开始；如果欲从当前结点向下搜索则不能有以上特殊字符打头。<BR>　　示例，与当前结点同名的元素在其父元素内的个数：<BR>&nbsp;&nbsp;childNumber(this.selectNodes("../"+this.nodeName+"[end()]").item(0))<BR>　　当前元素内名字为"skill"的元素的个数：<BR>&nbsp;&nbsp;childNumber(this.selectNodes("skill[end()]").item(0))</P>
<P>31、selectSingleNode<BR>　　含义：与selectNodes类似，不同的只返回匹配的第一个结点、而不是结点集合。<BR>　　语法：pNode.selectSingleNode('pattern')<BR>　　示例，与当前结点同名的元素在其父元素内的个数：<BR>&nbsp;&nbsp;&nbsp;&nbsp; childNumber(this.selectSingleNode("../"+this.nodeName+"[end()]"))<BR>　　当前元素内名字为"skill"的元素的个数：<BR>&nbsp;&nbsp; childNumber(this.selectSingleNode("skill[end()]"))</P>
<P>32、text<BR>　　含义：返回结点与它的子树内的文字内容。<BR>　　语法：pNode.text<BR>　　示例，整个文档内的文字内容：this.ownerDocument.text<BR>　　当前元素及其子树的文字内容：this.text</P>
<P>33、xml<BR>　　含义：返回结点及其后代的XML表示。<BR>　　语法：pNode.xml<BR>　　示例，当前文档的XML内容：this.ownerDocument.xml<BR>　　另有几个函数不作介绍，列于其下以供参考，如感兴趣，请访问<A href="http://msdn.microsoft.com/">http://msdn.microsoft.com</A>获取详细说明。</P>
<P>&nbsp;&nbsp;&nbsp;formatTime(varTime, bstrFormat,varDestLocale) <BR>&nbsp;&nbsp;&nbsp;formatDate(varDate, bstrFormat,varDestLocale)<BR>&nbsp;&nbsp;&nbsp;apendChild(newChild)<BR>&nbsp;&nbsp;&nbsp;definition<BR>&nbsp;&nbsp;&nbsp;CloneNode<BR>&nbsp;&nbsp;&nbsp;insertBefore(newChild, refChild)<BR>&nbsp;&nbsp;&nbsp;parsed<BR>&nbsp;&nbsp;&nbsp;removeChild(oldChild)<BR>&nbsp;&nbsp;&nbsp;replaceChild(newChild, oldChild)<BR>&nbsp;&nbsp;&nbsp;specified<BR>&nbsp;&nbsp;&nbsp;transformNode(stylesheet)<BR>&nbsp;&nbsp;&nbsp;transformNodeToObject(stylesheet,outputObject) <BR>&nbsp;&nbsp;&nbsp;uniqueID(pNode) <BR><BR></P></FONT><img src ="http://www.blogjava.net/bibi/aggbug/20096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-11-16 16:44 <a href="http://www.blogjava.net/bibi/archive/2005/11/16/20096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL 学习笔记 —— 基础篇</title><link>http://www.blogjava.net/bibi/archive/2005/11/16/20026.html</link><dc:creator>鱼上游</dc:creator><author>鱼上游</author><pubDate>Wed, 16 Nov 2005 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/bibi/archive/2005/11/16/20026.html</guid><wfw:comment>http://www.blogjava.net/bibi/comments/20026.html</wfw:comment><comments>http://www.blogjava.net/bibi/archive/2005/11/16/20026.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/bibi/comments/commentRss/20026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bibi/services/trackbacks/20026.html</trackback:ping><description><![CDATA[<H3>什么是 XSL？在什么情况下应该使用它？</H3>
<P>XSL 之于 XML 就像 CSS 之于 HTML。它是指可扩展样式表语言 (EXtensible Stylesheet Language)。这是一种用于以可读格式呈现 XML 数据的语言。XSL 实际上包含两个部分： </P>
<UL>
<LI>XSLT – 用于转换 XML 文档的语言 
<LI>XPath – 用于在 XML 文档中导航的语言 </LI></UL>
<P>XSLT 是指 XSL 转换 (XSL Transformation)，它是 XSL 最重要的部分。 </P>
<P>XSLT 可以将 XML 文档转换为其它 XML 文档、XHTML 输出或简单的文本。这通常是通过将每个 XML 元素转换为 HTML 元素来完成的。由于 XML 标签是用户定义的，浏览器不知道如何解释或呈现每个标签，因此必须使用 XSL。XML 标签的意义是为了方便用户（而不是计算机）理解。</P>
<P>XSLT 还可以对 XML 树进行下列操作：</P>
<UL>
<LI>添加和删除元素 
<LI>添加和删除属性 
<LI>对元素进行重新排列或排序 
<LI>隐藏或显示某些元素 
<LI>查找或选择特定元素 </LI></UL>
<P>&nbsp;</P>
<H4>XSL 是否与 XML 相同？</H4>
<P>既是又不是。说是，是因为它们遵循相同的语法规则（只有少许差异，下面我将会讲到）。说不是，是因为它们的用途不同：XML 用于承载数据，而 XSL 则用于设置数据的格式。XSL 声明与 XML 声明的不同之处在于，XML 声明只写一行，而且没有结束标签，而 XSL 声明必须包含结束标签。<BR><BR></P>
<H4>在什么情况下应该使用 XSL？</H4>
<P>XSL 在设计时有几个目标用途，这些用途使它成为某些开发情况下的完美解决方案，而对另一些开发情况则毫无用处。</P>
<UL>
<LI>XSL 专门用于处理 XML 文档，并且遵循 XML 语法。因此，它只能在支持 XML 的应用程序中与 XML 结合使用。最合适使用 XML 和 XSL 的情况是：Web 门户、新闻聚合器、社区网站或其它任何需要向各种设备及大量客户端提供信息的 Web 应用程序。 
<LI>XSLT 是一种基于模式匹配的语言。它会查找匹配特定条件的节点，然后应用相应的规则。因此，它不具备大多数编程语言的计算能力。例如，XSL 无法在运行时更改变量的值。它不应该用于从使用复杂公式的动态数据源（例如在线商店）来计算值。Web 编程语言更适于此用途。 
<LI>XSL 不能代替或补充 CSS。它不应（也不能）用于设置 HTML 的样式。但是，您可以将其用于需要频繁重新设计可视化效果、频繁更换布局以及以灵活格式处理数据的网站。 
<LI>XSL 不是内容管理工具。它不应（也不能）用于更改 XML 文档的内容或者编辑信息。但是，您可以将 XML 和 XSL 用于需要处理几种不同格式文档的内容管理系统。 </LI></UL>
<H4>服务器端与客户端</H4>
<P>服务器端转换工作流程如下图所示：<IMG height=381 alt=o_fig01.gif src="http://www.blogjava.net/images/blogjava_net/bibi/4653/o_fig01.gif" width=515 border=0><BR><BR>客户端 XSL 转换的工作流程：<BR><IMG height=427 alt=o_fig02.gif src="http://www.blogjava.net/images/blogjava_net/bibi/4653/o_fig02.gif" width=254 border=0><BR><BR><BR></P>
<H3>什么是 XPath？</H3>
<P>XSL 使用 XPath 来标识 XML 树中需要处理的各个元素。</P>
<P>XPath 规范基本上遵循与文件系统寻址相同的规则：</P>
<UL>
<LI>如果 XPath 表达式以斜杠 (/) 开头，代表的是 XML 元素的绝对路径（从 XML 文档的根开始）。 
<LI>如果 XPath 表达式以双斜杠 (//) 开头，则会选择当前文档中符合指定条件的所有元素，而不考虑它们在 XML 文档中的位置。例如，<CODE>//employee</CODE> 会查找 XML 文档中的所有员工节点。 
<LI>星号 (*) 会选择由前面的路径定位的所有 XML 元素。例如，<CODE>/company/department/*</CODE> 选择一个部门的所有子节点，即该部门的所有员工。 
<LI>点 (.) 选择当前的节点，两个点 (..) 选择父节点。例如，用于选择某个员工所在的部门的 XPath 表达式就是 <CODE>../employee</CODE>。 
<LI>要选择属性，请使用 <CODE>@</CODE> 字符。例如，<CODE>/company/department/employee[@retired]</CODE> 选择指定了 <CODE>retired</CODE> 属性的所有员工。 </LI></UL>
<H4>过滤项目</H4>
<P>使用 <CODE>&lt;xsl:for-each&gt;</CODE> 构造，您还可以根据条件过滤输出。假设您只想显示雇员中的程序员。</P>
<DIV class=preWrapper><PRE>&lt;xsl:template match="/"&gt;
&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;xsl:for-each select="company/department/employee[job='Programmer']"&gt;
&lt;tr&gt;
&lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="job"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="salary"/&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/xsl:for-each&gt;
&lt;/table&gt;
&lt;/xsl:template&gt;
</PRE></DIV>
<P>要定义 XML 节点的条件，可以使用下列任何运算符：</P>
<UL>
<LI>等于 (=) 
<LI>不等于 (!=)例如，name!='Ben Walker' 
<LI>小于 (&lt;)例如，salary&lt;2750 
<LI>小于或等于 (&lt;=) 
<LI>大于 (&gt;) 
<LI>大于或等于 (&gt;=) </LI></UL>
<H4>对项目进行排序</H4>
<P>可以将项目按字母顺序排列。只需使用 <CODE>&lt;xsl:sort /&gt;</CODE> 构造，并指定按哪个节点进行排序。<CODE>&lt;xsl:sort /&gt;</CODE> 元素必须嵌套在 <CODE>&lt;xsl:for-each&gt;</CODE> 元素中，以确保应用程序可以循环通过所有的项目。使用下面的代码可以按字母顺序显示员工：</P>
<DIV class=preWrapper><PRE>&lt;xsl:template match="/"&gt;
&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;xsl:for-each select="company/department/employee"&gt;
&lt;xsl:sort select="name" /&gt;
&lt;tr&gt;
&lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="job"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="salary"/&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/xsl:for-each&gt;
&lt;/table&gt;
&lt;/xsl:template&gt;
</PRE></DIV>
<P>当然，您只需在 <CODE>&lt;xsl:sort /&gt;</CODE> 元素中额外添加一个属性，即可方便地在升序和降序排列顺序之间切换：</P>
<DIV class=preWrapper><PRE>&lt;xsl:sort select="/name" order="descending"/&gt;</PRE>
<H4>单一条件和多个条件</H4>
<P>在大多数语言中，XSL 还能够根据条件显示内容。</P>
<P>单一条件是使用下面的语法定义的：</P>
<DIV class=preWrapper><PRE>&lt;xsl:if test="表达式"&gt;
&lt;/xsl:if&gt;</PRE></DIV>
<P>要对多个项目运行条件测试，以便只显示满足该条件的项目，需要将 <CODE>xsl:if</CODE> 构造嵌套在 <CODE>xsl:for-each</CODE> 元素中。下面的示例显示了如何只列出薪金高于 2700 元的员工：</P>
<DIV class=preWrapper><PRE>&lt;xsl:template match="/"&gt;
&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;xsl:for-each select="company/department/employee"&gt;
&lt;xsl:if test="salary &amp;gt; 2700"&gt;
&lt;tr&gt;
&lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="job"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="salary"/&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/xsl:if&gt;
&lt;/xsl:for-each&gt;
&lt;/table&gt;
&lt;/xsl:template&gt;
</PRE></DIV>
<P>请注意，小于 (&lt;) 和大于 (&gt;) 符号由它们相应的 HTML 转义序列（&amp;lt 和 &amp;gt）代替。否则，它们很容易与标签的开头和结尾混淆。&nbsp;&nbsp;&nbsp; <BR></P>
<P>在测试表达式中可以使用常用的条件运算符：</P>
<UL>
<LI>&amp;lt（小于） 
<LI>&amp;gt（大于） 
<LI>=（等于） 
<LI>!=（不等于） </LI></UL>
<P>如果需要将某个值与某个字符串进行比较，则要将字符串放在单引号中（例如 <CODE>&lt;xsl:if test="job = 'Software Analyst'"&gt;</CODE>）。<BR><BR></P>
<P>象大多数编程语言中的 IF-ELSE 构造一样，您还可以定义更复杂的条件。所使用的语法一看就能明白：</P>
<DIV class=preWrapper><PRE>&lt;xsl:choose&gt;
&lt;xsl:when test="<EM>表达式</EM>"&gt;

&lt;/xsl:when&gt;
&lt;xsl:otherwise&gt;

&lt;/xsl:otherwise&gt;
&lt;/xsl:choose&gt;</PRE></DIV>
<P>为了在多个 XML 节点上测试条件，<CODE>&lt;xsl:choose&gt;</CODE> 构造必须嵌套在 <CODE>&lt;xsl:for-each&gt;</CODE> 循环中。</P>
<P>假设您要以绿色高亮显示薪金低于 2700 元的所有员工，以蓝色高亮显示薪金高于 2700 元的所有员工：</P>
<DIV class=preWrapper><PRE>&lt;xsl:template match="/"&gt;
&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Salary&lt;/th&gt;
&lt;/tr&gt;
&lt;xsl:for-each select="company/department/employee"&gt;
&lt;xsl:choose&gt;
&lt;xsl:when test="salary &gt; 2700"&gt;
&lt;tr bgcolor="#66CCFF"&gt;
&lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="job"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="salary"/&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/xsl:when&gt;
&lt;xsl:otherwise&gt;
&lt;tr bgcolor="#00CC99"&gt;
&lt;td&gt;&lt;xsl:value-of select="name"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="job"/&gt;&lt;/td&gt;
&lt;td&gt;&lt;xsl:value-of select="salary"/&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/xsl:otherwise&gt;
&lt;/xsl:choose&gt;
&lt;/xsl:for-each&gt;
&lt;/table&gt;
&lt;/xsl:template&gt;
</PRE></DIV>
<P><CODE>&lt;xsl:otherwise&gt;</CODE> 元素指定的是当 XML 节点不满足初始测试条件时默认应用的规则。</P></DIV><img src ="http://www.blogjava.net/bibi/aggbug/20026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bibi/" target="_blank">鱼上游</a> 2005-11-16 11:43 <a href="http://www.blogjava.net/bibi/archive/2005/11/16/20026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>