<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='/themes/rss2browser.xsl'?>
<rss version="2.0"><channel><title>笛子的博客-专注于XML技术与前端开发</title><link>http://www.caizq.com/</link><description>技术改变世界</description><language>zh-cn</language><lastBuildDate>Fri, 27 Aug 2010 13:36:39 UTC</lastBuildDate><pubDate>Fri, 27 Aug 2010 13:36:39 UTC</pubDate><ttl>60</ttl><item><title>给RSS增加呈现样式（仅作呈现，不含订阅功能）</title><link>http://www.caizq.com/?type=detail&amp;id=14</link><author>快乐笛子</author><category>XML技术</category><pubDate>2010-08-26T21:37:14.314+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=14</guid><description>&lt;p&gt;&lt;img src="/uploadfiles/20100826222856056.png" align="left" style="margin-right:1em" /&gt;RSS(Really Simple Syndication) 是标准的 XML 文档，&lt;a href="http://en.wikipedia.org/wiki/RSS" target="_blank"&gt;wiki&lt;/a&gt;上可以找到它完整的文档，这里不再赘述。RSS大概是 1999 年 3 月被正式提出的，但很少有人关注。 3年后 IE6 发布，并迅速占领了市场，不知何原因，IE6 并不原生支持 RSS（估计是自大成性的MS从未关注过RSS），这也导致 RSS 一直被雪藏，直至 Firefox 的崛起，2005年开始 RSS 才流行开来。面对国内大量的 IE6，如何正常显示 RSS，而不是直接呈现 XML 代码呢？&lt;/p&gt;

&lt;p&gt;最有效的方法是使用 XSL 模板。IE5.5+ 后就支持使用 XSL 渲染 XML 数据了（顺便赞一下微软中国团队开发的MSXML组件）。 RSS 本身就是一个标准的 XML 文件，我们只要做一个 XSL 文件，并通过 XML 处理指令链接 XSL 文件，IE6 就会根据 XSL 来呈现 XML 数据。&lt;/p&gt;

只需在 RSS 的版本定义 &amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; 后增加一行：
&lt;pre name="code" class="xml"&gt;
&lt;?xml-stylesheet type="text/xsl" href="rss.xsl"?&gt;
&lt;/pre&gt;

查看完整的 &lt;a href="/rss.xml"&gt;RSS 例子&lt;/a&gt;(打开后查看源代码)&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;IE7+、Firefox、Safair 等现代浏览器原生支持 RSS，因此上面增加的处理指令将会被忽略，即他们将不按定制的 XSL 呈现 XML 数据，因为他们各自内置有一套 XSL 。&lt;/p&gt;

&lt;p&gt;Chrome 需要安装&lt;a href="https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd?hl=zh-cn" target="_blank"&gt;额外的插件&lt;/a&gt;才能支持 RSS，如果给 RSS 增加了上面的处理指令后，Chrome 即使不安装插件，也可以正常显示 RSS ！&lt;/p&gt;</description></item><item><title>用 Schema 约束 XML 数据</title><link>http://www.caizq.com/?type=detail&amp;id=13</link><author>快乐笛子</author><category>XML技术</category><pubDate>2010-08-14T16:46:46.708+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=13</guid><description>XML 是严格又自由的标记语言。我们都习惯于它的自由特性，自己想怎么定义都行，设计上非常自由，从不会因为它的标记特性约束到设计灵感的发挥。对于其严格特性，很多人的认识只停留在“标签的开始与结束必须一致，且不能错位嵌套”。本文主要想举例子来体现XML的严格特性。&lt;br /&gt;&lt;br /&gt;

举个例子，总公司需要收集所有子公司每个月份的销售数据（XML格式），这些子公司有些是收购来的，有些子公司产品具有地域特性与产品特性，这些子公司的销售数据不太一致。总公司为了收集这些数据，制定了一套约束数据的规则（Schema），子公司的数据只要通过有效性约束，就可以存入总公司的数据库。下面穿插一段从&lt;a href="http://baike.baidu.com/view/1374119.htm?fr=ala0_1" target="_blank"&gt;百度百科&lt;/a&gt;来的关于 Schema 的简介：&lt;br /&gt;
&lt;blockquote&gt;Schema是用于描述和规范XML文档的逻辑结构的一种语言，它最大的作用就是验证XML文件逻辑结构的正确性。可以理解成与DTD（文档类型定义）功能差不多，但是Schema在当前的WEB开发环境下优越很多。因为它本身就是一个有效的XML文档，因而可以更直观地了解XML的结构。除此之外，Schema支持命名空间，内置多种简单和复杂的数据类型，并支持自定义数据类型。由于存在这么多的优点，所以Schema渐渐成为XML应用的统一规范。&lt;/blockquote&gt;
&lt;br /&gt;
通过上述文字，可以看到 Schema 就是为了约束 XML 而设计的，它本身也是使用 XML 实现的（这是它比DTD更优秀的一个重要原因）。总公司通过设计一套严格的数据约束规范，就可以保证最终进入数据库的数据格式完整统一，可以生成有效的财务报表。&lt;br /&gt;&lt;br /&gt;

再来一个实际的例子，我的上一篇日志&lt;a href="http://www.caizq.com/?type=detail&amp;id=12" target="_blank"&gt;“使用 XMLSPY 设计项目的 Schema 原型 ”&lt;/a&gt;有一份定义邮件格式的 &lt;a href="http://www.caizq.com/uploadfiles/20100812101250252.xsd" target="_blank"&gt;Schema&lt;/a&gt; 文件，只要发送的邮件数据可以通过该 Schema 的有效性约束，则认为是有效的邮件，可以发送出去。&lt;br /&gt;&lt;br /&gt;
假定这是&lt;a href="/uploadfiles/20100814175137110.xml" target="_blank"&gt;一封邮件的XML数据&lt;/a&gt;，注意到其根节点引用了命名空间“&lt;strong&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/strong&gt;”，并在该空间下声明了特定的属性&lt;strong&gt;xsi:noNamespaceSchemaLocation&lt;/strong&gt;，其值指向了一个远程的 Schema 文件。当 XML 处理器载入邮件的 XML 数据时，执行验证方法，就会根据 Schema 中的定义去校验数据，通过与否，立马有结果，如果不通过还能知道原因。

&lt;pre name="code" class="vbs"&gt;
Dim dom
Set dom = CreateObject("MSXML2.DOMDocument.6.0")
dom.async = False
dom.resolveExternals = True '处理外部扩展，
dom.validateOnParse = False '如果为true，则在load的方法内部执行 validate 方法
Dim status
status = dom.load("http://www.caizq.com/uploadfiles/20100814175137110.xml")
MsgBox "载入XML数据：" &amp; status ' 是否成功载入 XML 数据，与 Schema 无关。

Dim e
Set e = dom.validate '执行 Schema 校验
If e.errorCode&lt;&gt;0 Then 
	MsgBox "数据不能通过 Schema 校验，原因：" &amp; Chr(13) &amp; e.reason
End If 
&lt;/pre&gt;

MSDN 上看到微软正强烈推荐用户使用 MSXML 6.0 以替换 3.0/4.0 等老版本。6.0版本改进了对W3C XSD 1.0 标准的支持，并且提高了与.Net Framework 2.0 中System.Xml的兼容性。新版本简化了 Schema 的加载过程，终于可以告别 3.0 的 &lt;strong&gt;XMLSchemaCache&lt;/strong&gt; COM对象。&lt;br /&gt;&lt;br /&gt;

根据此代码，制作成一个小工具，用于校验XML数据的有效性：&lt;br /&gt;
&lt;img src="/uploadfiles/20100814231755976.gif" /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;a href="/uploadfiles/20100814231811629.hta"&gt;点击下载&lt;/a&gt;</description></item><item><title>使用 XMLSPY 设计项目的 Schema 原型</title><link>http://www.caizq.com/?type=detail&amp;id=12</link><author>快乐笛子</author><category>XML技术</category><pubDate>2010-08-12T10:09:01.224+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=12</guid><description>&lt;a href="http://www.altova.com" target="_blank"&gt;&lt;img border="0" src="/uploadfiles/20100812205715286.jpg" alt="XMLSPY" align="left" /&gt;Altova&lt;/a&gt; 公司的 XMLSPY 是个不可多得的好东西，它几乎可以开发所有的 XML 产品。最近用它来做 Schema 的设计，感觉真的爽极了，它既直观地描述了还在大脑中的原型，又为日后的开发提供严格的约束，比其他的 XMind、Visio 等灵感图都实用。下面举一个例子，这是一般企业内部使用的邮件模型（仅单条邮件记录的原型）：&lt;br /&gt;

&lt;img src="/uploadfiles/20100812101238181.png" /&gt;&lt;br /&gt;

&lt;p&gt;上图非常清晰地描述了单条邮件的结构模型，每一个节点都有严格的约束。比如收件人可以有1到10个，每个user都有email（用正则约束，是user的节点值）和id，title两个属性，加上cc的user，一次发送最多可以有20个收件人。附件可有可无，如果有，则附件的 filename 与 filesize 是必须的属性。&lt;/p&gt;

&lt;p&gt;上图是用 XMLSPY 根据 Schema 自动生成的。&lt;a href="/uploadfiles/20100812101250252.xsd" target="_blank"&gt;点击此处&lt;/a&gt;可以查看 Schema 文件。XMLSPY 还可以根据此文件生成它的说明文档，非常省事。&lt;/p&gt;

Schema 主要是做数据校验用的，每一次发送数据，都应该先通过它的校验，校验通过则说明数据完全符合原型设计，可以放心地送出。至于如何使用 Schema 验证 XML 数据，稍后另行撰文举例。</description></item><item><title>使用 WinHttpRequest 伪造 Referer （附实战代码）</title><link>http://www.caizq.com/?type=detail&amp;id=11</link><author>快乐笛子</author><category>前端开发</category><pubDate>2010-08-06T23:32:13.843+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=11</guid><description>&lt;p&gt;首先说明，伪造访问来路不是什么光明正大的事情，目的就是为了欺骗服务器。原本以为给 XMLHTTP 对象增加一个 Referer 的header 就可以，结果却没有任何作用，改用 ServerXMLHTTP 也如此。&lt;/p&gt;  
&lt;p&gt;
无意间发现公司内部项目使用的 paypal 扣款程序里面有 &lt;strong&gt;WinHttp.WinHttpRequest.5.1&lt;/strong&gt; 对象，它负责把客户的信用卡信息提交到 paypal 的服务器，看来是一个核心的远程访问方法，google一下发现它居然用可以成功伪造所有 http 请求的 header 信息！下面的代码通过伪造 referer 的值，假装从百度首页提交一个表单到指定的 url 去：
&lt;pre name="code" class="js"&gt;
var url = "http://www.yourtarget.com";
var param = "name=david&amp;age=30";
var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
obj.Open("POST", url, false);
obj.Option(4) = 13056;
obj.Option(6) = false; //false可以不自动跳转，截取服务端返回的302状态。
obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
obj.setRequestHeader("Referer", "http://www.baidu.com");
obj.Send(param);
WScript.Echo(obj.responseText);
&lt;/pre&gt;
保存为 xxx.js 文件，在命令行中运行 cscript.exe xxx.js。
&lt;/p&gt;
&lt;p&gt;从msdn得知，&lt;strong&gt;WinHttp.WinHttpRequest.5.1&lt;/strong&gt; 是 msxml 4.0 的底层对象，也就是说 XMLHTTP/ServerXMLHTTP 也是在它的基础上封装而来。用 WinHttpRequest 发的请求，连 &lt;a href="http://www.fiddler2.com" target="_blank"&gt;Fiddler&lt;/a&gt; 也监测不到，看来确实是比较底层的东西。
&lt;/p&gt;
---------------------------&lt;em&gt;邪恶的分割线&lt;/em&gt;------------------------
&lt;p&gt;
既然可以用它来伪造所有 http 请求的 header，那 Cookies、Sessionid 自然也就可以得到并传递了。下面是实战代码，用命令行登录&lt;a href="http://www.cnblogs.com" target="_blank"&gt;博客园&lt;/a&gt;，共三次请求，第一次请求获取表单的 VIEWSTATE 和 EVENTVALIDATION，第二次带账户登录，第三次带Cookie访问其首页：
&lt;pre name="code" class="js"&gt;
//封装成远程访问的函数
function RemoteCall(method, url, param, header){
	var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
	obj.Open(method||"GET", url, false);
	obj.Option(4) = 13056;
	obj.Option(6) = false;
	if(method=="POST"){
		obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	}
	if(header){
		for(var key in header){
			if(key=="Cookie"){//根据 MSDN 的建议，设置Cookie前，先设置一个无用的值
				obj.setRequestHeader("Cookie", "string");
			}
			obj.setRequestHeader(key, header[key]);
		}
	}
	obj.Send(param);
	return obj;
}
//第一次远程访问博客园的登录入口
var url = "http://passport.cnblogs.com/login.aspx";
var objFirst = RemoteCall("GET", url, null);

//取得 viewstate 与 eventvalidation
var viewstate = objFirst.responseText.match(/id="__VIEWSTATE" value="(.*?)" \/&gt;/)[1];
var eventvalidation = objFirst.responseText.match(/id="__EVENTVALIDATION" value="(.*?)" \/&gt;/)[1];

//输入自己的账户与密码
var username = "";
var password = "";
var param = ""
+ "__VIEWSTATE="+encodeURIComponent(viewstate) 
+ "&amp;__EVENTVALIDATION="+encodeURIComponent(eventvalidation) 
+ "&amp;tbUserName="+username
+ "&amp;tbPassword="+password
+ "&amp;btnLogin="+encodeURIComponent("登  录");

var objSecond = RemoteCall("POST", url, param);

//登录成功后服务器执行 Response.Redirect 跳转，即向客户端发送了 302 状态代码
WScript.Echo(objSecond.status); //302即登录成功， 如果是200，则登录失败，页面没有跳转

//带上登录成功后的cookie，再次访问其首页
var json = {"Cookie": objSecond.getResponseHeader("Set-Cookie")};
var objThird = RemoteCall("GET", "http://www.cnblogs.com", null, json);
WScript.Echo(objThird.responseText);
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
上面的代码其实已经有一定恶意，我只为证明使用 WinHttpRequest 确实可以模拟浏览器发送请求，服务端也无法区别是从浏览器来的，还是从命令行来的。这证明到一点，&lt;strong&gt;从客户端提交来的任何数据都不可信&lt;/strong&gt;，因为发送的 http 数据包不但表单值可以修改，连数据包的header都可以随意修改。同时也说明，使用 VIEWSTATE 对表单的安全性无任何用处。
&lt;/p&gt;
&lt;p&gt;引用一张著名的漫画，在互联网上，没有人知道你是一条狗。在服务端，没有人知道你是从命令行发送出来的。
&lt;img src="/uploadfiles/20100807005911195.jpg" /&gt;
&lt;/p&gt;</description></item><item><title>小陶陶的靓照</title><link>http://www.caizq.com/?type=detail&amp;id=10</link><author>快乐笛子</author><category>小陶陶</category><pubDate>2010-07-26T22:48:49.218+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=10</guid><description>&lt;img src="/uploadfiles/20100726225541888.jpg" /&gt;&lt;br /&gt;
&lt;img src="/uploadfiles/20100726225551998.jpg" /&gt;&lt;br /&gt;
&lt;img src="/uploadfiles/20100726225557443.jpg" /&gt;&lt;br /&gt;
&lt;img src="/uploadfiles/20100726225610995.jpg" /&gt;&lt;br /&gt;
&lt;img src="/uploadfiles/20100726225617879.jpg" /&gt;&lt;br /&gt;</description></item><item><title>删除多余的属性 xmlns=""</title><link>http://www.caizq.com/?type=detail&amp;id=9</link><author>快乐笛子</author><category>XML技术</category><pubDate>2010-07-25T20:20:39.890+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=9</guid><description>&lt;p&gt;很早前就遇到这个空值的属性，它既出现在 html 文档中，也出现在 xml 中，一直都回避，放之任之，反正也不影响文档的正确性。隐隐约约过了大半年，终于有一天下定决心，一定要把这个问题彻彻底底搞个透，认真一分析，却发现这是一个 xml 命名空间基础知识，不是一个需要捋起两管衣袖再加深呼吸两口才能解决的问题。&lt;/p&gt;

&lt;p&gt;首先来重现此属性，现有的XML数据(people.xml)：
&lt;pre name="code" class="xml"&gt;
&lt;root xmlns\="http://www.example.com"&gt;
&lt;name&gt;张三&lt;/name&gt;
&lt;/root&gt;
&lt;/pre&gt;
&lt;em&gt;(注意上面的xmlns后面带有一个反斜杠，是为了防止语法高亮组件SyntaxHighlighter异常而加的，请透明视之，以下同)&lt;/em&gt;程序给root增加一个age节点用于描述“张三”的年龄（VBScript）：
&lt;pre name="code" class="vbs"&gt;
Dim dom
Set dom = CreateObject("MSXML2.DOMDocument")
dom.async = False
dom.load "people.xml"

Dim age
Set age = dom.createElement("age")
age.text = 25
dom.documentElement.appendChild age
dom.save "people.xml"
&lt;/pre&gt;

修改后的 people.xml 如下：
&lt;pre name="code" class="xml"&gt;
&lt;root xmlns\="http://www.example.com"&gt;
&lt;name&gt;张三&lt;/name&gt;
&lt;age xmlns=""&gt;25&lt;/age&gt;
&lt;/root&gt;
&lt;/pre&gt;
文档的root节点定义了一个默认的命名空间 http://www.example.com，即root元素的所有子孙元素都在此空间之下（除非它们另行定义有空间）。程序创建 age 节点时没有指明此节点具有哪个空间，即 age 的命名空间为空值，空值不等于 http://www.example.com，相当于 age 有自己的私有空间，它与父辈的空间不同，理所当然地会出现 xmlns 属性。要去除此属性有两个方法：
&lt;ol&gt;
&lt;li&gt;去除 age 祖先节点默认的命名空间&lt;/li&gt;
&lt;li&gt;创建 age 节点时指明其空间为祖先定下的默认空间&lt;/li&gt;
&lt;/ol&gt;
第一种方案一般是不会被采纳的，为了儿孙辈不太可能废掉祖先定下的规矩。第二种方案最简单：使用 createNode 方法替换 createElement 方法。
&lt;pre name="code" class="vbs"&gt;
Set age = dom.createNode(1,"age","http://www.example.com")
&lt;/pre&gt;
效果立现。
&lt;/p&gt;

&lt;p&gt;
除了程序会遇到命名空间继承的问题，xsl 模板中创建的元素也有此问题。比如创建元素：
&lt;pre name="code" class="xslt"&gt;
&lt;xsl:element name="a"&gt;
&lt;xsl:attribute name="href"&gt;http://www.example.com&lt;/xsl:attribute&gt;
&lt;xsl:value-of select="'Hello world'" /&gt;
&lt;/xsl:element&gt;
&lt;/pre&gt;
该 XSL 模板是由 Dreamweaver 创建，在经历 XSL 处理器转换后，输出的 a 元素同样也包含一个 xmlns="" 属性。根本原因还是创建的元素与其祖先的命名空间不一致。用 Dreamweaver 创建一个空的 XSLT(整页) 页面，其根节点&lt;br /&gt;

&lt;strong&gt;&amp;lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;gt;&lt;/strong&gt;&lt;br /&gt;

只声明了名为 xsl 的空间，它用于实现所有的xslt元素： &amp;lt;xsl:xxxx /&amp;gt;， 因此用 xsl 的方法创建出来的元素，它们的空间自然就在根节点声明空间之下，该死的是根节点并没有定义有默认空间，所以 xsl 方法创建的元素最终都将有一个 xmlns="" 属性。&lt;br /&gt;&lt;br /&gt;
这里需要注意到 XSLT 模板里面的 html 元素为了适合 w3c 所推荐的 xhtml 标准，它声明了一个默认空间&lt;br /&gt;&lt;strong&gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&lt;/strong&gt;&lt;br /&gt;
这个空间是对最终的 html 代码有效的，它对 xslt 没有任何作用。
&lt;br /&gt;&lt;br /&gt;
解决的方法同样有两种：&lt;br /&gt;
&lt;ol&gt;
	&lt;li&gt;给 xslt 页面的根节点 xsl:stylesheet 声明默认空间，令它与 html 元素的默认空间值一致&lt;/li&gt;
	&lt;li&gt;使用 xsl 方法创建元素时指明其空间，只要空间与默认空间一致，就不会出现 xmlns=""&lt;/li&gt;
&lt;/ol&gt;
这里推荐采用第一种方案，因为只需在 xsl 文档的根节点声明了与 html 元素一致的默认命名空间，用 xsl 方法创建的元素就与祖先的空间一致，就不会出现 xmlns=""，一劳永逸。&lt;br /&gt;方法二就需要每次都使用 
&lt;pre name="code" class="xslt"&gt;
&lt;xsl:element name="xx" namespace="http://www.w3.org/1999/xhtml"&gt;
...
&lt;/xsl:element&gt;
&lt;/pre&gt;
&lt;br /&gt;
明显第一种方案胜出。
&lt;br /&gt;&lt;br /&gt;

继续深入，怎样让 Dreamweaver 创建的 XSLT(整页) 模板根元素 xsl:stylesheet 自动带有默认命名空间&lt;strong&gt;xmlns="http://www.w3.org/1999/xhtml"&lt;/strong&gt;。
&lt;br /&gt;找到文件：&lt;br /&gt;
C:\Program Files\Adobe\Adobe Dreamweaver CS3\configuration\DocumentTypes\MMDocumentTypeDeclarations.xml&lt;br /&gt;
用记事本打开，在文件底部，可以看到 Dreamweaver 创建 xslt 页面时所使用的模板，只需把默认的命名空间加在此处就 OK 了。
&lt;a href="/uploadfiles/20100725223817301.zip" style="text-decoration:underline"&gt;猛击此处&lt;/a&gt;下载修改后的文件，下载解压后覆盖原文件即可。
&lt;/p&gt;</description></item><item><title>JavaScript 给汉字排序</title><link>http://www.caizq.com/?type=detail&amp;id=8</link><author>快乐笛子</author><category>前端开发</category><pubDate>2008-04-25T11:07:12.123+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=8</guid><description>&lt;div&gt;数组的 sort 方法默认字符的编码排序，有时候要给一组汉字排序，默认的方法就不适用了。比如
&lt;pre name="code" class="javascript"&gt;
var arr = ["中","华","人","民","共","和","国"]
&lt;/pre&gt;
在执行 sort 方法后结果为 ：中,人,共,华,和,国,民，既不是拼音也不是笔划数量的排序。&lt;/div&gt;
&lt;div&gt;以前很少留意过 localeCompare 方法，手册中说它执行时返回一个值，指出在当前的区域设置中两个字符串是否相同。返回值有三种：-1，0，1，刚好是 sort 方法参数所需要的类型。把 localeCompare 应用到 sort 方法中去，看看结果：&lt;/div&gt;

&lt;pre name="code" class="javascript"&gt;
var arr = ["中","华","人","民","共","和","国"];
alert(arr.sort(function(a,b){return a.localeCompare(b)}));//结果为：共,国,和,华,民,人,中(拼音升序)
&lt;/pre&gt;

&lt;div&gt;注意到 localeCompare 方法是在&lt;strong&gt;当前区域&lt;/strong&gt;中进行比较的，即比较的环境为当前操作系统设置的地理区域，比如数字、货币、日期时间等的表现方式（在“控制面板”中可以查看修改），如果设置排序的方式为&lt;strong&gt;笔划&lt;/strong&gt;，那上面的结果则为：人,中,民,共,华,和,国(笔划升序)。&lt;/div&gt;</description></item><item><title>使用 HTML 和 MSXML6.0 创建一个超轻量级 XPath 测试程序</title><link>http://www.caizq.com/?type=detail&amp;id=7</link><author>快乐笛子</author><category>XML技术</category><pubDate>2009-04-23T10:20:52.150+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=7</guid><description>&lt;p&gt;在开发和调试基于XML的应用的时候，程序员往往为找不到合适的快速桌面XPATH测试软件发愁。诚然，市面上有成套的XML编辑软件，但是它们往往要么太过于庞大，安装维护不是很方便，要么就是不免费，自己写一个吧，又觉得处理UI很烦。特别是在利用MSXML开发软件的程序员，很想使用MSXML直接测试自己写的XPATH对不对。笔者这里提供各位程序员一个基于HTML和MSXML6的超轻量级XPATH测试程序参考和使用：
&lt;br /&gt;
&lt;img src="http://www.happyshow.org/attachments/month_0904/20090423102218155.gif" alt="缩略图" /&gt;

&lt;/p&gt;

&lt;p&gt;你可以把这个程序放在WEB服务器上供其他同事共享，或者放在自己的文件系统直接用IE打开（对不起，这个程序只在IE上测试过）。打开后左面的窗口可以贴你的测试XML文本，右边可以随心所欲的敲入你的XPATH语句。在XPATH下方会随你的输入立刻输出可能的XPATH输出结果。红色代表错误，黑色代表正确，灰色代表XPATH的执行没有任何结果返回。&lt;/p&gt;

&lt;p&gt;点击&lt;a href="http://www.happyshow.org/attachments/month_0904/20090423102347113.html" target="_blank"&gt;这里&lt;/a&gt;直接运行该程序。笔者真诚的希望这个小程序会对你的XML和MSXML开发工作有所帮助。&lt;/p&gt;

&lt;p&gt;蒋欣 高级软件开发主管&lt;/p&gt;</description></item><item><title>锦绣中华与民俗村</title><link>http://www.caizq.com/?type=detail&amp;id=6</link><author>快乐笛子</author><category>杂七杂八</category><pubDate>2008-04-27T23:56:39.737+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=6</guid><description>&lt;div&gt;在深圳呆的时间不算短，掐指算来几近8个年头，而本地的景点锦绣中华却从未踏进去，一来对本地的东西没有好感，二来也没有时间和人少的机会。小静同学两天前拿到半价的门票，该来的还是来了，虽然今天天气不算好，一直都灰沉沉的，还有点闷，中午等小静同学一放学就直奔南山而去。&lt;br /&gt;
&lt;br /&gt;
噼里啪啦，半天胡掐乱按，终于把相机的存储卡折腾完毕加耗完一对电池，看看战果，470张赫然在目。晚饭后，决定从中挑起数张贴于博客中，小静同学也仿效，又再折腾了一番，终于有下面的收成。在这里还特别提一下新上手的处理相片软件&lt;a href="http://neoimaging.beareyes.com.cn/" target=_blank&gt;《光影魔术手》&lt;/a&gt;，今天发布了免费版。赞~&lt;br /&gt;
&lt;br /&gt;
&lt;style type="text/css"&gt;
img.minsu {display:block; margin:1em}
&lt;/style&gt;
&lt;img class="minsu" alt="普及一下知识：孔雀叔叔才会开屏哦" src="http://www.happyshow.org/attachments/month_0804/20080427001.jpg"/&gt;
&lt;img class="minsu" alt="金戈王朝" src="http://www.happyshow.org/attachments/month_0804/20080427002.jpg"/&gt;
&lt;img class="minsu" alt="金戈王朝-打斗场面" src="http://www.happyshow.org/attachments/month_0804/20080427003.jpg"/&gt;
&lt;img class="minsu" alt="陕北窑洞" src="http://www.happyshow.org/attachments/month_0804/20080427004.jpg"/&gt;
&lt;img class="minsu" alt="窑洞内部" src="http://www.happyshow.org/attachments/month_0804/20080427005.jpg"/&gt;
&lt;img class="minsu" alt="原来鸡公车陕北人也有~" src="http://www.happyshow.org/attachments/month_0804/20080427006.jpg"/&gt;
&lt;img class="minsu" alt="微型的布达拉宫~" src="http://www.happyshow.org/attachments/month_0804/20080427007.jpg"/&gt;
&lt;img class="minsu" alt="奉天承运，皇帝诏曰" src="http://www.happyshow.org/attachments/month_0804/20080427008.jpg"/&gt;
&lt;img class="minsu" alt="老戏台" src="http://www.happyshow.org/attachments/month_0804/20080427009.jpg"/&gt;
&lt;img class="minsu" alt="不知道什么果子，比尾指还小一些" src="http://www.happyshow.org/attachments/month_0804/20080427010.jpg"/&gt;
&lt;img class="minsu" alt="缩微建筑之天坛" src="http://www.happyshow.org/attachments/month_0804/20080427011.jpg"/&gt;
&lt;img class="minsu" alt="小长城" src="http://www.happyshow.org/attachments/month_0804/20080427012.jpg"/&gt;
&lt;img class="minsu" alt="小静同学今天好开心~~~" src="http://www.happyshow.org/attachments/month_0804/20080427013.jpg"/&gt;

&lt;/div&gt;</description></item><item><title>用 XSLT 把 XML 数据生成柱状图</title><link>http://www.caizq.com/?type=detail&amp;id=4</link><author>快乐笛子</author><category>XML技术</category><pubDate>2009-05-18T10:38:06.870+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=4</guid><description>&lt;img src="/uploadfiles/20100812213314607.jpg" align="left" /&gt;这是一个非常简单的解决方案，柱状图中每一条柱都是一个 div，数据的大小呈现在 div 的宽或高上。
&lt;a href="/attachments/month_0905/20090518104140177.xml" target="_blank"&gt;查看演示&lt;/a&gt; &lt;a href="/attachments/month_0905/20100812213314607.zip"&gt;例子下载&lt;/a&gt;&lt;br /&gt;
实现的原理也很简单，在所有数据中获取最大的一个(getMax)，把它当做满分，即 div 的宽或高度最大，其他数据都参考该最大值相应缩小 div 的宽高。

&lt;p&gt;由于目前 msxml 还不支持 XSLT 2.0 的函数，所以在 XSLT 1.0 实现 getMax 方法，还需要用到 for-each：&lt;/p&gt;

&lt;pre name="code" class="xslt"&gt;
&lt;xsl:variable name="theMax"&gt;
&lt;xsl:for-each select="/root/month/date"&gt;
&lt;xsl:sort data-type="number" order="descending" /&gt;
&lt;xsl:if test="position()=1"&gt;&lt;xsl:value-of select="." /&gt;&lt;/xsl:if&gt;
&lt;/xsl:for-each&gt;
&lt;/xsl:variable&gt;
&lt;/pre&gt;</description></item><item><title>分享自己写的一个小型 js 框架：myJSFrame (附 API 开发文档)</title><link>http://www.caizq.com/?type=detail&amp;id=3</link><author>快乐笛子</author><category>前端开发</category><pubDate>2007-07-17T10:42:00.799+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=3</guid><description>&lt;p&gt;
myJSFrame 是一款小巧微型的 JavaScript 框架，它有 prototype 的风格，又兼有 JQuery 的味道，它的特点是体积小（目前为17k），使用方便。&lt;/p&gt;
&lt;p&gt;它在一定程度上改变了传统的 JavaScript 编程风格。它还能识别 CSS 代码，它增加了 DOM 方法，扩展了 String 与 Array 原型对象，模拟 　StringBuffer、NameSpace 类，支持操作 Cookie，浏览器检测。当然，Ajax 还是它的强项，$ 函数支持的 CSS 选择符也不弱 ……&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;a href="http://www.happyshow.org/myJSFrame/api/JavaScript/myJSFrame.js"&gt;下载 myJSFrame (0.2.1.6)&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a target="_blank" href="http://www.happyshow.org/myJSFrame/api/"&gt;API 开发文档&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>发布一个简单的网络收藏夹</title><link>http://www.caizq.com/?type=detail&amp;id=2</link><author>快乐笛子</author><category>杂七杂八</category><pubDate>2008-08-02T20:32:09.313+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=2</guid><description>&lt;p&gt;这是一个非常简单的网络型收藏夹，你在上班时收藏的网址，将被记录在服务器上，在家里上网时也能找到之前收藏的网址。即使重装系统也不需要备份，或者出差到异地也能方便找到你收藏的网址。&lt;/p&gt;
&lt;p&gt;这甚至不是一个软件，称为一种网络服务更为恰切一些，它需要一个非常小的客户端，安装后在 IE 窗口的右键将新增两个项目：“加入网络收藏”、“管理网络收藏”。如果你喜欢网上的一篇文章，浏览时右键选择“加入网络收藏”，就完成了收藏任务，在其他装有此客户端的电脑上就能找到文章的链接，当然需要注册用户的登录。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.happyshow.org/myfav/netfavorites.exe"&gt;点击下载&lt;/a&gt;&lt;/p&gt;</description></item><item><title>博客程序第n次更新！</title><link>http://www.caizq.com/?type=detail&amp;id=1</link><author>快乐笛子</author><category>杂七杂八</category><pubDate>2010-07-24T15:50:18.693+08:00</pubDate><guid>http://www.caizq.com/?type=detail&amp;id=1</guid><description>这又是一个从零开始写起的版本，从2006年开始，已经记不清有多少次更新，多少回修改。期间还用过&lt;a href="http://www.pjhome.net" target="_blank"&gt;PJBlog&lt;/a&gt;，也尝试过php+mysql，每一次更新都是一次改进，都是积累一段时间的集中爆发。这次的版本最大变动是页面使用 xsl 模板技术，页面所有数据都通过 xml 装载，然后在服务器把 xml 与 xsl 转换为 html。&lt;br /&gt;&lt;br /&gt;
基本流程图如下：&lt;br /&gt;
&lt;img src="/uploadfiles/20100811114827931.png" alt="基本流程图" /&gt;&lt;br /&gt;
&lt;p&gt;
&lt;strong&gt;[注]&lt;/strong&gt;:鉴于原来的日志数据大部分都比较陈旧，且格式不一致，因此只保留其中的少数，其余的都打包装柜，不再提供！如需索取，请邮联：misshjn#163.com。
&lt;/p&gt;</description></item></channel></rss>
