quanhui 的个人资料Software design & develo...照片日志列表更多 工具 帮助
4月26日

大学生混的最高境界

1 考试版  

  凡人:什么?明天要考高数??  

  得道:什么?下节课要考高数??  

  入仙:什么?刚才考的是高数??  

  成佛: 什么?昨天有考试??  

  高级佛爷:高数?刚才考的不是英语??  

  我寝室一哥们:高数是什么树??  

  2 睡觉逃课版  

  凡人:靠!快迟到了。赶紧起!(8点上课7点55起来的)  

  得道:靠!怪事,今天起早了!(8点上课7点55起来的)  

  入仙:靠!已经迟到了,干脆接着睡!帮我请个假。  

  成佛:(朦胧中)别叫我,让我再睡会儿。  

  (画外音:起来吧,你已经连逃一个星期了!)  

  老样子,帮我喊到!  

  高级佛爷:选修课必逃,必修课选逃。今天星期二,按惯例不去,接着睡。  

  (画外音:你不怕教授发现吗?)  

  教授?开学三个月,我还不认识谁是教授那!  

  我宿舍那哥们一天早起六点半,高高兴兴去上课,今天终于没迟到,到了课堂看见辅导员怒气冲冲看着他,他胆怯的说:“我今天没迟到。”  

  辅导员说:“我知道,可你昨天一天去哪了?”  

  (原来这哥们睡了一整天加一个晚上)  

  3 上课睡觉版  

  凡人:今天又睡了一整节英语。真他妈爽!  

  得道:今天又一觉睡到了中午吃饭,真他妈爽!  

  入仙:今天又睡得忘了吃中午饭,真他妈不爽!  

  成佛:早上来的,天怎么这么快就黑了,现在是夏天,天黑这么早?  

  高级佛爷:醒来以后发现饿的走不了路了,于是接着倒下睡。  

  我宿舍那哥们,有一次教授对他说:“***,你以后不要迟到了,那样会影响你的睡眠质量。”  

  毕业做论文期间,笑傲江湖正在热播,遂有几个哥们搞了碟回来通宵观看。话说一哥们被导师连下5道金牌后仍拒绝去实验室做实验,导师终于气急,亲自打电话到该哥们宿舍:我找XXX。好巧不巧,刚好是该哥们本人接的电话,他一听,想都不想,直接说:啥事啊?导师说:你叫他来实验室做实验。他:他忙着看笑傲江湖呢,去不了~~~~~~~~~导师FT,之后当导师再想起这个哥们,直接说:那个笑傲江湖今天来了没有……  

  大三的某天晚上有加课,我因为要到火车站去接某位生病同学的父亲,所以没能去上课。接了人,想着回到宿舍的时候估计宿舍得是空的。正发愁怎么安置这位父亲呢,谁想到,男生宿舍灯火通明,进去一看,大半个班的人都在,奇怪之余,问到:你们都找的什么借口没去上课啊,众答:到火车站接同学父亲啊~~~~~我~~~晕
4月15日

[转载]<开发者必读>Lotus 公式用法归类

访问用户环境

用户环境是包含数据库的服务器或工作站,数据库包括以下内容: 复制公式、由新邮件到达时或定时触发的代理、选择公式或列公式。否则,用户环境是用户运行公式的 Notes 工作站。
用户名可以是专有名称也可以是非专有名称,专有名称可以是规范或缩写的,使用 @Name 可更改用户名的格式。
以下函数返回或处理用户环境的信息。
函数 描述
@UserName 返回用户名或服务器名。
@Name([key]; name) 更改用户名的格式。关键字包含 [CN] 以从一个专有名字中解析出公共名,[Abbreviate] 缩写规范格式的专有名字,[Canonicalize] 与上述作用相反,[ToKeyword] 将名字各部分按相反顺序排序,用反斜杠分开(用于分类视图)。
@UserRoles 对于服务器上的数据库,返回当前用户的角色列表。
@MailDbName 返回用户邮件数据库的服务器名和路径名。该 @function 计算出一个包含两元素的列表。
@OptimizeMailAddress(address) 从地址中删除无用的网络域。
@Platform 返回用户当前运行的平台:Macintosh、 NetWare、 OS2V1、 OS2V2、 UNIX、 Windows/16 或 Windows/32。
@Version 返回正在运行的 Notes 版本(字符串)。
@Password(string) 对字符串加密。加密后别人无法从中得到最初的字符串。


访问当前数据库和视图

可以直接访问正在运行公式的数据库(便捷图标除外,因为它没有数据库环境)。也可以在视图环境中直接访问正在运行公式的视图。同样,在文档环境中可直接访问打开文档的视图。
数据库和视图属性
下表列出返回数据库和视图属性的函数。
函数 描述
@DbManager 返回当前对数据库有“管理者”权限的用户、群组和服务器。返回一个列表。
@DbName 返回当前 Notes 服务器和数据库的名称。返回二个元素的列表。
@ViewTitle 返回当前视图的标题。
窗口标题和列公式 @function
许多 @function 提供了关于视图的答复层次和其他方面的信息。在视图中,主文档以 1、2、3 等编号。每组答复文档或答复的答复文档则有第二个和第三个层次的从 1 开始的编号。缺省情况下,完整的答复文档的编号以小数形式出现。例如:第三个主文档的第二个答复文档编号为 3.2,而它下面的第一个答复文档编号为 3.2.1。
这些函数仅工作于窗口标题和列公式中,有一些会被限制。返回值都是一个字符串。
函数 描述
@Responses 返回当前视图中当前文档的答复文档的编号(只限于窗口标题公式)。
@DocLevel 返回在当前视图中当前文档的级别。
@DocSiblings 返回与当前文档同级的文档编号(包含当前文档)。
@DocNumber 返回当前视图中的当前文档或分类的编号。
@DocNumber(sep) 同上,只是用 sep,而不是句点来分隔编号。
@DocNumber("") 同上,只是仅返回编号的最右边部分。
@DocParentNumber 返回当前视图中当前文档或分类的父文档或父分类的编号。
@DocParentNumber(sep) 同上,只是用 sep,而不是句点分隔编号。
@DocParentNumber("") 同上,只是仅返回编号的最右部分。
@DocDescendants 返回后续文档的编号。包含当前文档的子文档,子文档的子文档。
@DocDescendants(def) 同上,只是返回 def。在 def 中使用 % 以表示编号。
@DocDescendants(zero; def) 同上,只是如果没有后续文档的话则返回 zero。
@DocDescendants(one, zero; def) 同上,如果只有一个后续文档的话,则返回 one。
@DocChildren 返回当前文档的直接子文档的编号。
@DocChildren(def) 同上,仅返回 def。在 def 中使用 % 以表示编号。
@DocChildren(zero; def) 同上,只是如果没有后续文档的话,则返回 zero。
@DocChildren(one, zero; def) 同上,如果只有一个后续文档的话,则返回 one。
@IsCategory 如果当前行的当前域右边任何域是一个分类,则返回一个星号。
@IsCategory(True) 同上,只是返回 Frue 代替星号。
@IsCategory(True; False) 同上,但是如果没有分类域,则返回 False。
@IsExpandable 如果当前行是可展开的,则返回一个加号。
@IsExpandable(True) 同上,只是返回 True 代替加号。
@IsExpandable(True; False) 同上,但是如果当前行是不可展开的,则返回 False。

使用 @function 通过 LS:DO 访问外部数据库

以下 @function 通过 ODBC 访问外部数据库并返回一个值或值的列表:
@DbColumn 返回表的一列中的全部值,或者全部的不同的值。
@DbLookup 返回表的一列中通过关键字匹配选定的值。
@DbCommand 将一个命令传递给外部的数据库管理系统(DBMS)并返回结果。
@DbColumn 与 @DbLookup 都只能提取数据。它们不能增加、删除、修改数据或执行其他操作。@DbCommand 能提取数据或发送其他可以更改数据的 SQL 语句。LotusScript 提供了包括更新外部数据库的更加强大的功能。
前四个参数对于三个函数是同样的,通过 ODBC 建立访问数据库。这些参数是:
"ODBC" 是字符常量;或 "ODBC" : "NoCache"
定义在数据源表格中的数据源名称(在 Windows 中的 ODBC.INI)
用户标识符,两个用户标识符列表,或者一个空串,根据外部数据源而定
口令,两个口令列表,或者一个空串,根据外部数据源而定
(@DbColumn 和 @DbLookup) 要访问的表的名称
(@DbCommand) 要执行的命令
(@DbColumn 和 @DbLookup) 要访问的列的名称
处理由数据源返回的空数据的选项
(@DbLookup) 包含关键字的列名
(@DbLookup) 适当的数据类型的关键字值,或者是一个列表
(@DbColumn 和 @DbLookup) 两个元素的列表:“Distinct”作为关键字或空串;“Ascending”或“Descending”作为一个关键字
在需要用 IDS 和口令的地方,您可以指定空串并让用户在执行函数时提供它们。

使用 @function 通过 LS:DO 访问外部数据库

1. 该公式取得 MANUAL 表中的 PARTNO 列。
@DbColumn("ODBC";"Oracle";"";"";"MANUALS";"PARTNO";"":"Ascending")
2. 该公式从 MANUALS 表的行中取得 TITLE,在该行中 PARTNO 是 17-895A。
@DbLookup("ODBC";"Oracle";"";"";"MANUALS";"TITLE";"PARTNO";"17-895A")
3. 该公式从 MANUALS 表中的 ONHAND 列的数字值小于 100 的每行中取得 PARTNO 列值。
@DbCommand("ODBC";"Oracle";"";"";"SELECT PARTNO FROM MANUALS WHERE ONHAND <100")

转换数据类型

在对数据操作时类型必须是正确的。以下的函数用来转换数据和测试数据类型。
函数 描述
@Text(value) 将一个值转换为文本字符串。
@Text(value; format) 根据指定的格式将一个数字或时间-日期值转换成文本字符串。
@TextToNumber(string) 将文本字符串转换成一个数字。
@TextToTime(string) 将文本字符串转换成一个日期-时间值。
@IsText(value) 如果值是文本字符串或文本字符串列表,则返回“真”值 (1)。
@IsNumber(value) 如果值是数字或数字列表,则返回“真”值 (1)。
@IsTime(value) 如果一个值是时间-日期或时间-日期列表,则返回“真”值 (1)。
@Char(number) 将一个 IBM 代码页 850 代码转换为对应的字符。

连接、比较和判定长度

运算符 + 用来连接字符串。运算符 =、<>;、!=、=!、>;<、<、>;、<= 和 >;= 用来比较字符串。以下的函数用来判定字符串的长度和比较字符串:
函数 描述和用法
@Length (string) 以字符为单位返回字符串的长度。
@Length(stringlist) 以字符为单位,返回字符串列表中每个元素的长度。
@Matches (string; pattern) 判定两个字符串是否匹配。可以用通配符来扩展比较的范围。
@Like (string; pattern) 判定两个字符串是否匹配。遵循 ANSI SQL 标准。
@Like(string; pattern; esc) 与上面的一样只是多了一个转义字符。
@Matches @Matches 用“?”来匹配任意一个单独的字符,用“*”来匹配任意的字符序列,@Matches 使用“\”作为转义字符。
@Like 按照 ANSI X3.135-1992 标准,使用“_”(下划线)来匹配任意一个单独的字符,用“%”(百分号)来匹配任意的字符序列。

查找并提取子串

样例
以下函数查找并提取子串:
函数                               描述
@Contains(string; sub) 判定一个字符串是否包含一个子串。
@Contains(string; list) 判定一个字符串是否包含一个列表中的子串。
@Begins(string; sub) 判定一个字符串是否以一个子串开始。
@Ends(string; sub) 判定一个字符串是否以一个子串结束。
@Left(string; n) 从一个字符串中提取最左边的 n 个字符。
@Left(string; sub) 从一个字符串中提取最左边的字符,直到一个子串为止,从左到右搜索。
@LeftBack (string; n) 从一个字符串中提取最左边的字符,直到从右边开始的第 n 个字符为止。
@LeftBack(string; sub) 从一个字符串中提取最左边的字符,直到一个子串为止,从右到左搜索。
@Right(string; n) 从一个字符串中提取最右边的 n 个字符。
@Right(string; sub) 从一个字符串中提取最右边的字符,直到一个子串为止,从左到右搜索。
@RightBack (string; n) 从一个字符串中提取最右边的字符,直到从左边开始的第 n 个字符为止。
@RightBack(string; sub) 从一个字符串中提取最右边的字符,直到一个子串为止,从左到右搜索。
@Middle(string; off; n) 从一个字符串中提取 n 个字符,从一个偏移量开始,从左到右搜索。
@Middle(string; sub; n) 从一个字符串中提取 n 个字符,从一个子串开始,从左到右搜索。
@Middle(string; off; sub) 从一个字符串中提取字符,从一个偏移量开始,到一个子串结束,从左到右搜索。
@Middle(string; sub; sub) 从一个字符串中提取字符,从一个子串开始,到另一个子串结束,从左到右搜索。
@MiddleBack(str; off; n) 从一个字符串中提取 n 个字符,从一个偏移量开始,从右到左搜索。
@MiddleBack(str; sub; n) 从一个字符串中提取 n 个字符,从一个子串开始,从右到左搜索。
@MiddleBack(str; off; sub) 从一个字符串中提取字符,从一个偏移量开始,到一个子串结束,从右到左搜索。
@MiddleBack(str; sub; sub) 从一个字符串中提取字符,从一个子串开始,到另一个子串结束,从右到左搜索。
@ReplaceSubstring(source; from; to) 在 source 中用 from 的内容替换 to 的内容。如果 from 和 to 都是列表,按次序替换对应的项目。
@Word(string; sep; n) 从 string 提取单词 n,其中单词是在指定的分隔符之间的文本。
@Word(list; sep; n) 从列表中的每个字符串中提取单词 n,其中单词是在指定的分隔符之间的文本。

修剪、重复、添加新行,并改变大小写

样例
以下函数修剪字符串、重复字符、添加新行(回车),并改变大小写:
函数 描述
@Trim(string) 从字符串中删除开头、结尾和多余的空格。
@Trim(list) 从字符串列表的每个元素中删除开头、结尾和多余的空格,并从列表中删除空白元素。
@Repeat(string , number) 将字符串重复若干次。
@NewLine 在文本字符串中插入一个新行(回车)。
@LowerCase(string) 将字符串中所有的大写字符转换成小写。
@UpperCase(string) 将字符串中所有的小写字符转换成大写。
@ProperCase 将字符串中每个单词的第一个字符转换成大写,并将其余的字符转换为小写。

执行算术运算

乘、除、加、减运算符(*/+-)。乘法和除法运算符的优先级高于加法和减法;运算顺序是从左到右。但可以使用括号更改运算顺序。以下列出的是算术运算函数。
函数                         描述
@Abs(number) 计算一个数的绝对(无符号)值。
@Sign (number) 对于正数返回 1,对于负数返回 -1,对于零则返回 0。
@Sum(num; num; ...) 计算数字和数字列表的和。
@Integer(number) 去掉数字的小数部分,使它成为整数。
@Integer(numlist) 去掉数字列表所有元素的小数部分,使它们成为整数。
@Round(number) 对一个数字进行四舍五入。
@Round(number; factor) 以一个指定的因子规整数字。
@Round(numlist) 对数字列表中的每个数字进行四舍五入。
@Round(numlist; factor) 以一个指定的因子规整数字列表中的每个元素。
@Max(number; number) 取两个数中较大的一个。
@Max(numlist; numlist) 对两个数字列表进行矩阵式操作时,取两个数字中较大的一个
@Min(number; number) 取两个数中较小的一个。
@Min(numlist; numlist) 对两个数字列表进行矩阵式操作时,取两个数字中较小的一个。
@Modulo(number; number) 计算一个数字被第二个数字除后得出的余数。
@Modulo(numlist; numlist) 对两个数字列表进行矩阵式操作时,计算一个数字被第二个数字除后得出的余数。
@Power(base; exp) 指数计算。
@Sqrt (number) 计算平方根。
@Pi 取得圆周率。
@Log(number) 计算常用(以 10 为底)对数。
@Ln(number) 计算自然(以 e 为底)对数。
@Exp(number) 计算以 e 为底的指数。
@Random 返回一个 0 到 1 之间的随机数。
@Sin(angle) 计算角度的正弦(弧度)。
@Cos(angle) 计算角度的余弦(弧度)。
@Tan(angle) 计算角度的正切(弧度)。
@Asin(sine) 反正弦函数。
@Acos(cosine) 反余弦函数。
@Atan(tangent) 反正切函数。
@Atan2(x; y) 计算以 y/x 作为正切值的反正切函数。

答复列的公式

仅用于答复的列需要公式来生成总结答复文档的文本。
包含作者的信息
讨论数据库可以使用如下答复列的公式来显示答复文档的作者、日期和主题:
From + " added this comment: " + Subject + " (" + @Text(@Created) + ")"
按以下方式显示答复:
Stephanie Mahar added this comment: Great job! (10/10/97 04:43:15 PM)
跟踪文档状态
在雇员信息数据库中,答复列可以显示新雇员以及离职雇员的调查信息,作为“按雇员姓名”视图中常规的“雇员记录”的答复文档。下面公式根据答复文档使用的表单的不同,显示不同的消息,并且显示文档的邮递状态。
@If(Form = "Exit"; "Exit Form, "; "New Hire Information, ") + @If(Mailed = "Yes"; "mailed to employee " + @Text(@Date(PostedDate)); "not yet mailed")
如果答复文档使用 Exit 表单,那么答复行显示也许如下:
Exit Form, mailed to employee 08/26/97
如果答复文档使用 New Hire Information 表单,那么答复行显示也许如下:
New Hire Information, not yet mailed
跟踪答复的数目
可以使用 @DocDescendants 跟踪答复文档的数目,以便作者迅速知道收到多少答复文档。下面的主文档列(不是答复列)公式对于答复样式的视图非常有用。
Subject + " (" + @Name([CN]; From) + @DocDescendants(")"; ", % response)"; ", % responses)")
如果是主文档,那么列显示 Subject 域的内容、作者名称、答复以及答复的答复文档的数目。如果文档有一个答复,那么列显示“response”;否则显示“responses”。主文档行可作如下显示:
Need Help with Trade Show (Indy Montoya, 1 response)
Changing the Product Name (Sandy Braun, 2 responses)

视图小程序编程

通过使用一些 @commands 命令可以对视图小程序编程。有以下命令:
@command 描述
ViewCollapse 折叠所选文档
ViewExpand 展开所选文档
ViewCollapseAll 折叠所有文档
ViewExpandAll 展开所有文档
ViewRefreshFields 刷新视图。
刷新时,视图小程序不删除标记为已删除的文档
MoveToTrash 使当前所选文档标记为已删除
EmptyTrash 永久删除标记为已删除的文档
Folder 将所选文档移动或拷贝到文件夹
RemoveFromFolder 从当前文件夹删除所选文档。
4月11日

再接再励

现在胡老师叫我和德庆转dotnet2005,学webpart!~~
汗!!~~不太懂这个东西有什么用
 
博士家园的工作也完成了两项了
再一点点的申请过来做
还要做毕业设计啊
 
忙的日子使我过得充实!~~
4月7日

.Net框架下的XSLT转换技术简介

Net框架下的XSLT转换技术简介

一.前言:

  XSLT转换技术是XML中的一项重要技术,本文将向XML开发者介绍.Net框架下的一些不同的XSLT转换技术。同时,本文还将介绍如何运用各种不同的输入数据源以完成一个XSLT转换。在.Net框架下,System.Xml.Xsl.XslTransform类能根据一个XSLT样式表文件转换一个XML文档,它是XSLT转换中最重要的一个类,同时它能够支持W3C的XSLT 1.0的语法,其运用的命名空间是http://www.w3.org/1999/XSL/Transform。

  二.与XSLT转换相关的输入数据源:

  .Net框架下有许多类可以完成读取XML文档以实现XSLT转换的功能,其中最有用的当属System.Xml.XmlReader类了。它是一个虚基类,因此不能被直接运用,必须有一个类继承它。.Net框架下有三个类是从该类继承过来的:XmlTextReader类、XmlNodeReader类以及XmlValidatingReader类,它们都是包含在命名空间System.Xml中的。其中XmlTextReader类能从一个XML文档中读取字符流并检查该文档是否是具有良好结构(well-formed)的,但它并不运用DTD或是XML模式进行XML文档的验证工作。XmlNodeReader类允许数据从任何XML文档对象模型(DOM)的API中被读取,比如一个System.Xml.XmlNode对象,而且XmlNode对象并不必是一个完整的XML文档的根节点,它可以是其一个子节点。XmlValidatingReader类能保证一个XML文档是遵从一个DTD或是XML模式所确定的规则的。下面是一个XmlReader类作为XSLT转换的输入数据源的应用实例。

  // 将一个XSLT文件的字符串导入到一个TextReader对象中
  System.IO.TextReader tr = new System.IO.StreamReader("numbers.xsl");
  // 将上面的TextReader对象作为XmlTextReader对象的数据源
  System.Xml.XmlReader xr = new System.Xml.XmlTextReader(tr);
  // 创建一个新的XslTransform对象
  System.Xml.Xsl.XslTransform trans = new System.Xml.Xsl.XslTransform();
  // 将XmlReader对象中的样式表导入到上面的XslTransform对象中
  trans.Load(xr);



  另一种能完成读取XML文档以实现XSLT转换功能的类是System.Xml.XPath.XPathNavigator类或是任何实现了System.Xml.XPath.IXPathNavigable接口的类,这些类包括了System.Xml.XPath.XPathDocument类,System.Xml.XmlDocument类以及System.Xml.XmlDataDocument类。System.Xml.XPath.XPathNavigator类是基于XPath数据模型的,并提供了能够对任何XML数据进行XPath查询的方法。

  System.Xml.XPath.XPathDocument类是这些类中速度最快的一个类,因为它是只读的,在XSLT转换对速度的要求很高时应该使用这个类。System.Xml.XmlDocument类的效率仅次于System.Xml.XPath.XPathDocument类,而System.Xml.XmlDataDocumnet类并不适合XSLT转换,因为它的效率最低。System.Xml.XPath.IXPathNavigable接口可以在任何数据源上实现,同时它允许任何类型的数据作为XSLT转换的数据源。下面的示例代码可以被接在上面的例子后面。

  // 创建一个新的XPathDocument对象,并从一个XML文件导入数据源

  System.Xml.XPath.XPathDocument xp = new

  System.Xml.XPath.XPathDocument("numbers.xml");

  // 创建一个新的XPathNavigator对象

  System.Xml.XPath.XPathNavigator xpn = xp.CreateNavigator();

  XslTransform类要求XML或XSLT的数据源是一个XmlReader对象或是一个XPathNavigator对象。它的两个最重要的方法是Load()方法和Transform()方法,这两个方法并不提供重载的对Stream对象直接进行处理的方法,但是却可以间接地将Stream对象作为XSLT转换的数据源,而该Stream对象则是从XML文件或XSLT样式表中获取的。下面的代码创建了一个Stream对象,并显示了如何将它作为XSLT转换的数据源,不过该代码段仅仅是一个示例,并没有实际的数据存在。

  // 创建一个新的Stream对象

  System.IO.Stream st = new System.IO.MemoryStream();

  // 在此运用一个XML文件填充上面的Stream对象并将Stream对象的位置置为0

  st.Position = 0;

  // 将Stream对象导入到一个XPathDocument对象中

  System.Xml.XPath.XPathDocument xp = new System.Xml.XPath.XPathDocument(st);

  // 对XSLT文档进行同样的操作

  System.IO.Stream XSLTStream = new System.IO.MemoryStream();

  // 在此运用一个XSLT文件填充上面的Stream对象并将Stream对象的位置置为0

  st.Position = 0;

  // 创建一个XmlReader对象,并将上面的Stream对象作为数据源

  System.Xml.XmlReader xsltXR = new System.Xml.XmlTextReader(XSLTStream);

  // 以后,该XmlReader对象就可以被传递到XslTransform类的Load()方法中去了

  上面的代码中并没有实际的数据存在,我们需要将XML文件或XSLT样式表填充到Stream对象中才能进行实际的操作。另一种设置输入数据源的方法是以字符串的形式从一个URL获取XML文档或XSLT文档,同时还可能有一个可选择的System.Xml.XmlResolver对象,该方法是最直接也是最有效的方法。

  三.与XSLT转换相关的输出数据源:

  在介绍了XSLT转换的输入数据源之后,本文接着向大家介绍与之相关的输出数据源。根据所运用的不同类型的输出类,xsl:output元素有时可以被忽略掉。比如在运用XmlWriter类或XmlReader类作为输出类的时候,该元素就被忽略掉了。有关xsl:output元素的详细内容请参考MSDN的文章"Outputs from an XslTransform",这里限于篇幅就不多作介绍了。

  综上所述,进行XSLT转换的必要条件包括了一个XML文档,一个XSLT文档以及一个能处理输出的有效对象。下面的代码运用了一个XPathDocument对象以及一个样式表文件进行XSLT转换,其输出的结果被直接显示在控制台中了。

  // 创建一个新的XslTransform对象

  System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform();

  // 从XSL文件中导入样式表

  xslt.Load("numbers.xsl");

  // 创建一个新的XPathDocument对象,并导入一个XML文件

  System.Xml.XPath.XPathDocument doc = new

  System.Xml.XPath.XPathDocument("numbers.xml");

  // 创建一个新的XmlTextWriter对象用于完成到控制台的数据输出

  System.Xml.XmlTextWriter writer = new

   System.Xml.XmlTextWriter(System.Console.Out);

  // 进行实际的XSLT转换操作

  xslt.Transform(doc, null, writer);

  // 在完成操作后关闭XmlTextWriter对象

  // 同时请注意一旦关闭该对象就不能往控制台中写任何额外信息了

  writer.Close();

  四.与XSLT转换相关的流对象:

  .Net框架允许程序员将XSLT转换的结果直接输出到一个System.IO.Stream对象,下面的代码将使用一个用于输出的System.IO.MemoryStream对象,然后显示如何运用它进行与XSLT转换的输出相关的操作。

  // 创建一个新的XslTransform对象

  System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform();

  // 从XSLT文件中导入样式表

  xslt.Load("numbers.xsl");

  // 导入一个XML文件

  System.Xml.XPath.XPathDocument doc = new

   System.Xml.XPath.XPathDocument("numbers.xml");

  // 创建用于输出的Stream对象

  System.IO.Stream str = new System.IO.MemoryStream();

  // 进行实际的转换操作

  xslt.Transform(doc, null, str);

  // 对Stream对象进行Flush操作,并将其位置置为0

  str.Flush();

  str.Position = 0;

  如果一个System.Xml.XmlDocument对象或一个System.Xml.XPath.XPathDocument对象已经被载入到主存中了,那么它们也可以被用作XSLT转换的输入数据源。因为这两个对象都实现了System.Xml.XPath.IXPathNavigable接口,所以都可以作为XslTransform对象的Transform()方法的参数被直接使用。

  // 创建一个新的XslTransform对象

  System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform();

  // 从XSLT文件中导入样式表

  xslt.Load("numbersXML.xsl");

  // 将一个XML文档导入到一个XPathDocument对象中

  System.Xml.XPath.XPathDocument doc = new

   System.Xml.XPath.XPathDocument("numbers.xml");

  // 创建用于输出的Stream对象

  System.IO.Stream str = new System.IO.MemoryStream();

  System.Xml.XmlWriter xw = new

   System.Xml.XmlTextWriter(str,System.Text.Encoding.UTF8);

  // 进行实际的转换操作

  xslt.Transform(doc, null, xw);

  // 对XmlWriter对象进行Flush操作,并将Stream对象的位置置为0

  xw.Flush();

  str.Position = 0;

  五.与XSLT转换相关的嵌入式脚本以及代码:

  .Net框架中的XSLT转换对象提供了对在XSLT文档中用脚本扩展元素来嵌入脚本语言的支持。脚本语言所提供的一组功能比纯XSLT所提供的功能要丰富,经常可以用来对文档内容进行更为复杂的操作,比如对其应用科学计算函数、访问外部信息源等。在.Net框架下,程序员运用msxsl:script元素可以标记XSLT样式表中的嵌入式脚本或代码。脚本扩展元素必须在urn:schemas-microsoft-com:xslt namespace命名空间中声明。.Net框架中的分析器能够支持C#、VB.Net、VBScript或JScript等代码编写的脚本。在脚本元素中,我们通过提供一个implements-prefix属性定义了函数所调用的命名空间,通过提供一个language属性定义了函数所使用的编程语言。同时,我们得注意一个样式表中可以嵌入多种语言的脚本代码,但是同一个命名空间下只能使用同一种语言。下面的实例显示了一个包含嵌入式C#函数的样式表。

<xsl:stylesheet version=''1.0''
xmlns:xsl=''http://www.w3.org/1999/XSL/Transform''
xmlns:msxsl=''urn:schemas-microsoft-com:xslt''
xmlns:theScript=''urn:CustomScript''>
<xsl:output omit-xml-declaration=''yes'' method=''text''
media-type=''text/plain'' indent=''no'' />
<xsl:variable name=''displayme'' />

<msxsl:script implements-prefix=''theScript'' language=''C#''>
<![CDATA[
public string HelloName(string name)
{
return "Hello " + name;
}
]]>
</msxsl:script>

<xsl:template match=''/''>
<xsl:text disable-output-escaping=''yes''>Print Integers > 3</xsl:text>
<xsl:apply-templates select=''Root/Numbers'' />
Script Result: <xsl:value-of select=''theScript:HelloName("Joe")'' />
Done: <xsl:value-of select=''$displayme'' />
</xsl:template>

<xsl:template match=''Numbers''>
Numbers:<xsl:apply-templates select=''Integer[@value > 3]'' />
</xsl:template>

<xsl:template match=''Integer''>
Integer: <xsl:value-of select=''@value'' />
</xsl:template>
</xsl:stylesheet>



  六.样式表参数以及扩展对象:

  XSLT提供了一个在样式表中使用参数以及扩展对象的机制。在.Net框架下,程序员可以通过运用System.Xml.Xsl.XsltArgumentList类实现将参数或扩展对象传递到一个样式表。在样式表中使用参数的机制允许程序员声明一个全局变量,该变量被定义为xsl:variable类型的元素,它是作为一个xsl:stylesheet的子元素而存在的,但它并不包含在xsl:template之中。通过调用XsltArgumentList类的AddParam()方法程序员可以实现添加参数的功能,该方法中的三个参数依次为有效的名称、命名空间的URI以及参数值。如果参数值不是一个字符串、布尔值、数字、节点片断(Node Fragment)或节点集合(Node Set),那么它将被强制转化为双精度浮点值或是字符串。而一个扩展对象是任何一个能返回XSLT数据类型值的.Net类。通过调用XsltArgumentList类的AddExtensionObject()方法程序员可以实现添加扩展对象的功能,该方法中的两个参数分别为有效的名称以及命名空间的URI。下面的代码显示了如何运用XsltArgumentList类在样式表中使用参数以及扩展对象的方法。

  // 创建一个新的XPathDocument对象,并导入一个XML文件

  System.Xml.XPath.XPathDocument xp = new

   System.Xml.XPath.XPathDocument("numbers.xml");

  // 创建一个新的XslTransform对象

  System.Xml.Xsl.XslTransform trans = new System.Xml.Xsl.XslTransform();

  // 导入一个XSLT文件到上面的XslTransform对象中

  trans.Load("numbersExtension.xsl");

  // 创建一个新的XsltArgumentList对象

  System.Xml.Xsl.XsltArgumentList xslArg = new

   System.Xml.Xsl.XsltArgumentList();

  // 调用XsltArgumentList对象的AddParam()方法以添加参数

  xslArg.AddParam("displayme","","Is this fun?");

  // 创建一个新的扩展对象

  SayHello hi = new SayHello();

  // 调用XsltArgumentList对象的AddExtensionObject()方法以添加扩展对象

  xslArg.AddExtensionObject("urn:SayHello",hi);

  // 创建一个新的System.IO.Stream对象以处理输出结果

  System.IO.Stream str = new System.IO.MemoryStream();

  // 进行实际的转换操作

  trans.Transform(xp, xslArg, str);

  // 对Stream对象进行Flush操作,并将其位置置为0

  str.Flush();

  str.Position = 0;

  // 创建一个新的StreamReader对象以读取流并返回字符串

  System.IO.StreamReader sr = new System.IO.StreamReader(str);

  string xmlOut = sr.ReadToEnd();

  // 关闭StreamReader 对象

  sr.Close();

  // 将结果写到控制台中

  Console.Write(xmlOut);

  // 扩展对象返回Hello Name

  public class SayHello  

  {

   public string HelloName(string name) {

   return "Hello " + name;

  }

  }

  通过上面的介绍,我们发现使用扩展对象和使用嵌入式脚本具有许多相同之处。下面我们分析一下使用扩展对象相对于使用嵌入式脚本的一些优缺点。

  移植性:嵌入式脚本比扩展对象更容易移植,因为任何.Net平台都可以正确地用嵌入式脚本来转换一个样式表。而另一方面,使用扩展对象的样式表则只能用一段代码来进行转换,而且需在.Net平台或其他一些支持扩展对象的平台下进行,并要求这段代码能正确地实现一个带有效的名称和命名空间URI的扩展对象。

  大小:一个依赖于扩展对象的样式表比包含嵌入式脚本的样式表要小,而且更容易维护。

  灵活性:正如我们看到的那样,依赖于扩展对象的样式表可以按照修改约束它们的扩展对象的功能来修改它们的行为。而使用嵌入式脚本的样式表则永远只能按照嵌入的脚本语言指定的功能执行操作。

  性能:因为扩展对象是预编译的,而不是即时编译的,因此使用扩展对象的脚本的性能在某种程度上要比嵌入式脚本高一些。不过具体情况下还要考虑装入样式表的频率以及嵌入式脚本的规模等因素。

  可维护性:使用扩展对象的样式表在修改和纠错时可能比较困难,因为真正的代码从样式表和提供扩展对象实现的代码中分离出去了。而嵌入式脚本尽管稍微慢一些,却具有将所有代码都置于本地的优点。

  通过考虑上述一些因素,我们可以决定在具体的情况下是使用扩展对象还是使用嵌入式脚本了。

  七.总结:

  本文向大家介绍了.Net框架下和XSLT转换相关的一些知识,XSLT转换技术是XML中的一项重要技术。.Net框架对XSLT转换提供了稳健的支持,它不仅完全支持W3C定义的XSLT规范,还有许多有用的扩展,比如在样式表中嵌入多种语言的脚本、使用扩展对象来扩展XSLT的功能等等,从而增强了.Net应用程序中样式表的易用性。最后,我希望大家能通过本文掌握.Net框架有关XSLT转换的一些基本技术,并了解每种技术的优缺点以更好地应用于实际的项目。
4月5日

ie变得很慢

今天又要些一部分的程序,运行浏览时,ie反应很慢!~但是任务管理器的cpu,内存使用率又不高,真不知道是什么原因?