随笔- 12  文章- 16  评论- 24 
2005年1月4日

XSLT 的 format-number() 函数格式化数字的功能的确狠强悍,简单的指定一个格式字符串就可以把数字格式化成任何想要的格式。但是最近遇到一个问题,如果格式化数字的时候如果被格式化的是一个非数字的字符串,那么输出的结果就会是一个 NaN 字符串,而我想要的却是显示“-” 字符。难道格式化之前首先要判断一次是否为 NaN? XSLT 的条件判断语句麻烦的要死,如果每次格式化都判断一次,势必非常繁琐。难道就没有别的办法了,查了一下 www.w3cshool.com , 原来和 format-number 配套的还有 <xsl:decimal-format> 这个元素。

<xsl:decimal-format name="name" decimal-separator="char" grouping-separator="char" infinity="string" minus-sign="char" NaN="string" percent="char" digit="char"
per-mille="char" zero-digit="char" pattern-separator="char"/>

<xsl:decimal-format> 定义了使用 format-number() 函数在将数字转换成字符串过程中用到的一些字符。使用 <xsl:decimal-format> 元素,可以改变修改上述特殊字符。例如在欧洲人们使用逗号表示小数点 :),这时<xsl:decimal-format> 元素就可以派上用场了。

 

除了定一个全局的格式以外,还可以定义一个带有 name 属性的<xsl:decimal-format>元素,format-number() 函数可以通过 name 来调用特定的元素,不会影响其它地方的 format-number 调用。

 

下面详细介绍属性

属性
描述
name string

可选。指定该格式的名称。如果设置了该属性,那么 format-number() 函数可以通过 name 加载某个特定的格式。如果不指定该属性,那么该格式将作为所有 format-number 的缺省格式。

例如:
<xsl:decimal-format name="euro" digit="D" />
<xsl:value-of select='format-number(12.033, "DD.0000","euro")' />
<br />
<xsl:value-of select='format-number(12.033, "##.0000")' />

输出:
12.033
12.033

decimal-separator char

可选。指定小数点,缺省为"."

 

例如:
<xsl:decimal-format decimal-separator="," />
<xsl:value-of select='format-number(12.033, "000,000")' />

输出:
012,033

这里的逗号就变成了小数点 :)

grouping-separator char

可选。指定千位分隔符,缺省为 ","

 

例如:
<xsl:decimal-format grouping-separator="*" />
<xsl:value-of select='format-number(1234567890, "###*###*###")' />

输出:
1*234*567*890

infinity string

可选。指定表示无穷大的字符串,缺省为 "Infinity"

 

例如:
<xsl:decimal-format infinity="无穷大" />
<xsl:value-of select='format-number(1 div 0, "0.0")' />

输出:
无穷大

minus-sign char

可选。指定表示负号的字符,缺省为"-"

 

例如:
<xsl:decimal-format minus-sign="+" />
<xsl:value-of select='format-number(-102, "0.0")' />

输出:
+102.0

还需要abs函数吗,直接转换输出好了

NaN string

可选。指定表示非数字的字符串,缺省为"NaN"

 

例如:
<xsl:decimal-format NaN="非数值" />
<xsl:value-of select='format-number(a, "0.0")' />

输出:
非数值

percent char

可选。指定百分号,缺省为"%"

 

例如:
<xsl:decimal-format percent="^" />
<xsl:value-of select='format-number(12, "0.0^")' />

输出:
1200.0^

per-mille char

可选。指定千分号,缺省为"‰"

 

例如:
<xsl:decimal-format per-mille="^" />
<xsl:value-of select='format-number(12, "0.0^")' />

输出:
12000.0^

zero-digit char

可选。指定表示数字0的字符串,缺省为"0"

 

例如:
<xsl:decimal-format zero-digit="2" />
<xsl:value-of select='format-number(123, "#.#")' />

输出:
345

digit char

可选。指定格式中出现该字符的地方需要一个数字,缺省为 #

 

例如:
<xsl:decimal-format digit="D" />
<xsl:value-of select='format-number(12.3, "D.D")' />

输出:
12.3

pattern-separator char

可选。指定格式中正负两种子模式的分隔符,缺省为 ";"

 

例如:
<xsl:decimal-format pattern-separator=";" />
<xsl:value-of select='format-number(123, "-000;+000")' />
<xsl:value-of select='format-number(-123, "-000;+000")' />

输出:
-123
+123

上表中“值” 一列中的 char 表示该属性是一个字符,string 表示该属性是一个字符串。 有了 <xsl:decimal-format>  元素,还会陷入拼接字符串的泥潭吗?

posted @ 2005-01-04 17:29 一切由.NET开始 阅读(1771) 评论(3) 编辑
2004年12月21日

最近项目里出现了一个怪问题,有一段脚本只有嵌在 .aspx 页面中才能正确执行,如果把它单独保存在一个 .js 文件里,然后在 .aspx 连接脚本文件就死活不能运行,总是脚本报错。折磨了很久,最后只能把脚本单独放在每个页面里面,可是很明显这种做法狠不好,每个页面都有一份拷贝,如果改起来可就很可怕了。

后来项目另外一个以前一直正常的 .js 文件也出现了这个问题,问题出在哪?对比了出错前后两个版本的代码,发现原来脚本里面的注释都是英文的,现在的增加了一行中文,。这才恍然大悟,肯定就是编码的问题了。一看果然,web.config,.aspx 都是设置为UTF-8 编码的,而 js 文件则是GB2312 编码,客户端执行页面时候嵌入的js 脚本没有中文倒好,有了中文之后被识别成乱码,整个脚本乱了套了,能执行才怪呢。

posted @ 2004-12-21 19:11 一切由.NET开始 阅读(765) 评论(0) 编辑
2004年11月25日
最近同事手里的一个项目需要用 XSLT + XML 输出 Microsoft Word 格式的 Doc文件。考虑到客户机器上安装的不一定是支持 WordML Office 2003, 所以XSLT + XML输出 WordML 的方案被剔除。此外商业的转换组件价格不菲,似乎也不行。还有就是转换成 RTF 格式,看上去也不容易。因为要输出的东西很简单,只有几个表格和文字,没有复杂的东西,最后采用了 XSLT + XML 输出 HTML 文件的方法,HTML 改扩展名为 doc,用 Word 打开,没有问题,看来这个办法是可行的。

XML 数据里面包含了 <br /> 这个 html 元素, 但是用 C# 进行 XsltTransform 死活就是输出不了 <br />。奇怪的是IE 直接浏览 XML 文件和 Javascript 调用 MSXML 得到的转换结果却是正常的 - <br /> 可以正常的显示出来。文件是这样写的(部分)

XML

<root>
   
<a><![CDATA[AAAAAA <br /> BBBBBB<br />CCCCCC]]></a>
</root>


XSLT:

<xsl:value-of disable-output-escaping="yes" select="/root/a"/>


Javascript

    var xml = new ActiveXObject("Msxml2.DOMDocument.4.0");
 xml.load(
"a.xml"); 
    var xslt = new ActiveXObject("Msxml2.DOMDocument.4.0");
 xslt.load(
"a.xslt");
 document.write(xml.transformNode(xslt));


C#
  

            XslTransform xslt = new XslTransform();
            XmlDocument xml 
= new XmlDocument();
            xslt.Load(
"a.xslt");
            xml.Load((
"a.xml"));
            
using (XmlTextWriter writer = new XmlTextWriter("a.doc", Encoding.Default))
            
{
                xslt.Transform(xml, 
null, writer, null);
                writer.Close();
            }

 

就是上面的这些代码,用浏览器直接看 xml 文件和 javascript 都是正常的输出的结果,就像事先设想的那样:

AAAAAA 
BBBBBB
CCCCCC 

但是 C# 那个版本的就是输出不了 <br />, 结果是这样的:

AAAAAABBBBBBCCCCCC 


Google 半天找到原来是这样样子的 XmlWriter XmlReader 将忽略 XSLT 中的 disable-output-escaping 这个选项(详情参考 http://www.dotnet247.com/247reference/msgs/28/142194.aspx)。将上述 C# 代码中的 XmlTextWriter 换成 FileStream 一切搞定。

System.IO.Stream strmTemp = new System.IO.FileStream("a.doc", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite);

 

posted @ 2004-11-25 14:23 一切由.NET开始 阅读(3675) 评论(6) 编辑
2004年11月9日
周末将一台机器上A的一个 ASP.NET 解决方案转移到另外一个机器B上,等到把所有的源代码都拷贝过去后却发现,在机器B 上面就不能使用 VS.NET 打开该解决方案,解决方案里面的其他项目都是好的(他们都是类库),但是就是 Web 项目打开不了,VS 出现下列提示:
Visual Studio .NET 没有从 Web 服务器获得适当的响应,因为没有正确安装某些组件。
很奇怪的这个解决方案在机器 A 上一切正常,而机器 B 上原有的项目也是一切正常,在尝遍了所有可能的办法(包括重启 IIS, 机器,重新注册 ASP.NET,重新安装 VS.NET )之后,依然没有任何作用。

最后没有办法,拿出最后的杀手锏 - FileMon , 打开解决方案,最终看到在读取项目的临时目录时候停了下来,马上删除临时目录,再次运行,OK 大功告成了。

B机器以前也打开过该解决方案的一个版本,该版本留在了缓存里面,可能和现在这个最新版本差别太大,于是VS.NET 读取缓存的时候出现了问题。不过似乎说不通。
posted @ 2004-11-09 19:23 一切由.NET开始 阅读(1895) 评论(3) 编辑
2004年10月26日

最近的 MSDN 上介绍了一个利用 Http Module Handler 实现的错误记录模块 ELMAH((Error Logging Modules And Handlers)), 他可以记录所有没有处理的 ASP.net 程序异常, 不需要修改现有的代码, 不需要重新编译部署, 修改 Web.config dll 拷到bin 就好了. ELMAH不仅可以记录下详细的出现在客户端著名的黄屏错误描述, 还包括服务器变量, Cookie, 窗体变量(默认的不在报告中显示Cookie, 窗体变量,但是可以自己修改扩展)等等其他东东.

错误日志的查阅也非常的方便, 非常的棒, 更好的是, 居然还支持发布成 RSS 这样就可以通过你喜欢的新闻阅读器定时查询阅读啦,下面就是MSDN上的几张图:

 

图1日志列表


图2查看详细错误信息


图3 RSS方式的日志信息

ELMAH
可以很方便的扩展支持多种后端存储方式, 它自身附带支持2种方式 : SqlErrorLog (SQL Server 2000) MemoryErrorLog (内存), 如果不能满足你的需要还可以增加比如 XML, 其他数据库等存储方式哦.

 

刚刚说了只要修改 Web.config 拷一个dll , 连查看日志需要访问的 aspx 页面都不需要, 纯粹是通过 httpHandler 处理的,干净利落. 最大程度上不会破坏原来的系统.不喜欢可以随时删掉.

 

具体的技术实现和用法文章里面都很详细的, 而且开放了代码, 大家可以在遵守许可前提下自由使用哦, 顺便再学习一下 Http Module Handler.

 

ELMAH 代码可以在这里下载

http://workspaces.gotdotnet.com/elmah

 

MSDN介绍文章在这里

http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnaspp/html/elmah.asp

posted @ 2004-10-26 09:23 一切由.NET开始 阅读(1970) 评论(4) 编辑
2004年10月25日
摘要: 下面的 XSLT 样式表语句是错误的<xsl:variablename="formatInfo"select="'dateTime'"/><xsl:call-templatename="$formatInfo"/>这是因为 XSLT call-template 模板名不可以是变量,它是一个 QName, 不能是表达式或者是属性值模板但是据说 Saxon 支持在运行时指定模板...阅读全文
posted @ 2004-10-25 11:28 一切由.NET开始 阅读(626) 评论(0) 编辑
2004年10月22日
摘要: 最近在做的一个B/S项目中需要绘制报表, 由于很多报表的表头非常复杂,, 而且许多列都是动态创建的,用DataGrid 实现起来非常麻烦. 考虑了一下, 所有的报表都用 XML + XSLT 动态创建, 虽然 XSLT 的语法有些累赘, 并且有很多先天的不足, 但是整体看来着实非常方便。40多张报表, 大概2天半就写完了。用户输入的一些表单由于也是报表的这番形式,一时兴起,全部都用 XML+XSL...阅读全文
posted @ 2004-10-22 13:09 一切由.NET开始 阅读(1899) 评论(2) 编辑
2004年10月18日
摘要: 一直以来我的电脑时常的出现这样的问题:在资源管理器中删除文件时候,资源管理器会有10几秒钟失去响应,其他程序中只要和删除这个动作有关的也会停止响应长达10几秒。奇怪的是这个问题不是一直存在的。以前我以为是 Windows 2000 系统的问题,Google 上也没有看到相关的解决办法。今天实在无法忍受了,决定找出问题所在。运行 FileMon, 然后删除一个文件,哗~ 文件列表不断刷新,可以看到 ...阅读全文
posted @ 2004-10-18 20:00 一切由.NET开始 阅读(2540) 评论(2) 编辑
2004年10月15日
摘要: 今天用 VS.NET 2003 编辑 ASPX 页面的时候,突然发现了这样的错误提示居然是“它要么存在,要么不存在。”,我想他想说的是要么这个 selected 属性不设值而单独存在,要么就根本不显示这个属性哦。阅读全文
posted @ 2004-10-15 10:03 一切由.NET开始 阅读(892) 评论(2) 编辑
2004年10月14日
摘要: 现在的B/S项目里面有一个要求:在浏览器里面实现显示服务器时间的时钟。如果是显示客户端的时钟倒是很简单了,但是显示服务器段时钟就……。肯定是不能每秒刷新页面了,首先的想法就是取得客户端和服务器端的时间差,然后在客户端用Js脚本显示,这显示的自然就是客户端当前时间加上这个时间差了。以前一直用的是JS,好像没有什么太容易的办法简单的实现诸如" 计算时间差", "加上一个时间间隔...阅读全文
posted @ 2004-10-14 10:28 一切由.NET开始 阅读(2825) 评论(2) 编辑