JavaScript must be enabled in order for you to view this page. However, it seems JavaScript is either disabled or not supported by your browser. To view this page, enable JavaScript by changing your browser options, then Try again! .

 
我的论坛
Google 网上论坛 Beta 版
Do Best Developer
访问此论坛

在XSLT中进行调试

这是一个非常容易被忽略的技巧,现在我要在这里强调它。

要使用这个技巧,我们必须了解xsl:message元素,它的定义为:

<!-- Category: instruction -->
<xsl:message
  terminate = "yes" | "no">
  <!-- Content: template -->
</xsl:message>

这个元素和print语句的作用有些相似,看到这里您应该明白我要做什么了吧?对,就是使用xsl:message元素打印一些消息。不过该元素输出消息的方式依赖于XSLT处理器,一般的情况是将消息输出到控制台,不过也可能弹出一个警告窗口或输出到日志文件中。

抛开今天的主题--调试,我想我们可以走的更远!

我们应该能够开发一个XSLT的日志记录模板库(Template Library)专门用来做日志记录。可以按照下面的方向努力:

  • 能够区分日志记录的类别
  • 能够区分日志记录的级别,如Debug、Info、Warn、Error等
  • 能够指定从那个级别开始输出日志记录
  • 能够定义日志输出的模式
  • ......

这个模板库不应该使用任何形式的扩展而应该尽量发挥XSLT的核心能力。

这个模板库的使用方式要简单,具体的方式可以考虑使用xsl:import和xsl:include。

如果有朋友对这个话题感兴趣,可以和我联系,我们一起讨论。如果有足够的支持我可以将它作为一个开源的项目大家一起开发。

Jakarta Commons Net

这是一个非常有趣的Java库,因此决定翻译一下,原文可以查阅Jakarta Commons Net

Jakarta Commons Net 实现了许多基础 Internet 协议的客户端部分。该组件的目标是提供基本的协议访问能力,而不是协议的高层抽象,因此,有一些设计违反了面向对象的设计原则。我们的哲学是要使协议的全部功能可以被访问,而且可以通过程序的方式访问,这样开发人员就可以构造他们自己的定制实现。

特性

支持的协议:

  • FTP
  • NNTP
  • SMTP
  • POP3
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

背景

Jakarta Commons Net 开始于 NetComponents 这个商业的 Java 库。在 Java 出现的早期,NetComponents 是由 ORO 开发的。在1998年 NetComponents 发布了1.3.8版本之后,它的源代码被捐赠给了Apache软件基金会,采用Apache License分发。从那时起,许多开发人员对Jakarta Commons Net的继续发展做出了贡献。当前的版本号模式已经和以前的没有关系了。换句话说就是 Jakarta Commons Net 1.0 是成功的并且替代了NetComponents 1.3.8。

Eclipse3.2的新特性

2006年6月30日,eclipse 3.2 正式发布了。

时间过得可真快!回想我刚刚开始使用eclipse哪会,大概是2003年初吧,当时eclipse还没有这么大的影响力。

3.2和以前发行的版本一样都有一个长长的新特性的列表,详细的内容可以查阅New and Noteworthy

而让我欣喜的是3.2大大增强了对重构的支持,如下:

  • Introduce Indirection refactoring
  • Extract Superclass refactoring
  • Clean Up wizard
  • Refactoring history
  • Create and apply refactoring scripts
  • JAR file export with refactorings
  • API aware refactorings
  • Rename Type updates similarly named elements
  • Rename Package refactoring renames subpackages
  • Filter the refactoring preview

ATOM联合技术的新宠 六

今天要结束这个主题了。让我们来从头回顾一下:

这个主题只是非常浅显的介绍了Atom的一些方面,目的只是想让大家对Atom有一个整体的认识。下面列出的内容可能更加实用:

Atom的主要应用场景:

  • Weblog内容联合
  • 新闻内容联合
  • 播客(Podcasting)发布
  • 软件升级

Atom的主要扩展:

  • Feed History,解决了Feed完整历史的重建问题
  • Feed Rank,解决了根据数值等级对Feed排序的问题
  • Feed Expiration,允许为发布的内容指定有效期
  • Feed License Link Relation,允许将版权许可与内容关联到一起
  • Atom Link No Follow,允许控制feed阅读器执行哪些自动化处理
  • Feed Thread,允许将一个条目标志为是另一个条目的响应

随着Atom社区的发展,Atom的应用场景会不断的增加,扩展也会不断的涌现。

ATOM联合技术的新宠 五

在上一篇中我们讨论了如何将自己的内容以Atom格式发布,现在来讨论一下如何处理其他人以Atom格式发布的内容。这同样也是一个见仁见智的问题。

您现在看到的页面就是从这个Atom Feed文档转换而来的,转换是通过xslt来完成的。

在做这个xslt的时候一定要充分的考虑Atom Syndication Format规范,下面看看我是怎么处理atomAuthor的:

<xsl:template match = "a:author" mode="authors">
  <div class="blogs-author">	
    <xsl:if test="position() = 1">
      <xsl:text>发布者:</xsl:text>
    </xsl:if>
    <xsl:choose>
      <xsl:when test = "a:uri">
         <a href="{a:uri}" title="{a:uri}">
            <xsl:value-of select="a:name"/>
         </a>
      </xsl:when>
      <xsl:otherwise>
         <xsl:value-of select="a:name"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text> </xsl:text>
    <xsl:if test="a:email">				
      <a href="mailto:{a:email}" title="给 {a:name} 发邮件">
        <img src="/images/email.gif" alt="给 {a:name} 发邮件"/>
      </a>
    </xsl:if>
    <xsl:if test="position() != last()">
       <xsl:text> | </xsl:text>
    </xsl:if>
  </div>
</xsl:template>

ATOM联合技术的新宠 四

如果您作为内容提供者会怎样发布自己的内容呢?要是我的话,我会遵循下面的过程:

内容发布过程

数据源可以是各种各样的,比如可以是文件,可以是数据库,也可以来源于网络,等等。我们的目标是将来自于这些数据源的数据联合到一起并以Atom格式发布。至于如何联合是要在橙色的框内解决的问题,这也是一个见仁见智的问题,关乎设计的好坏。

记得以前听到过一句话:要对接口进行编程。我想在这里应该好好的实践一下这句话,会有很大的收获。首先,要为Atom模型定义一组接口,这应该比较容易,因为只要遵循Atom规范就可以了。之后,再将从数据源抽取数据并填充Atom模型的过程抽象成一个接口A,作为Atom模型和数据源的一个桥梁。最后,要为每个数据源定制一个A接口的实现。

还有其它的一些方法,如可以将数据源中的数据提取成一种基于XML的中间格式,在用XSLT转换成ATOM格式或其它的格式(RSS或OPML等)。

方法还有很多,不过要选择适合自己场景的。

ATOM联合技术的新宠 三

Google Reader

见过上面的logo吗?这就是Google的在线阅读器,一款非常不错的软件。

单击上面的logo可以到达Google Reader的首页,在那里可以看到它的三个主要用途:

  • Spend your time reading what you care about most
  • Find the blogs and news sites you've been missing out on
  • Share interesting items with friends

要使用Google Reader你必须有一个Google Account。在首次登陆时会是下面的样子:

首次登陆时的样子

这时就需要告诉Google Reader我们想要订阅什么内容了,比如要订阅Solo L的博客网志就需要像下面那样输入内容的地址然后单击确定。

订阅内容

订阅好了之后马上就可以阅读了。

阅读内容

重复上面的过程就可以将大量的内容联合到一起。例如,要关注大量的新闻,而这些新闻来源于不同的站点,以前需要一个站点一个站点的浏览。现在好了,只要该站点支持联合就可以加入像Google Reader这样的阅读器,这样就可以集中阅读了。如果阅读器还提供一些附加的功能(如将阅读的和没有阅读的内容区分开等)那就可以获得更好的阅读体验了。

今天我们简单的接触了一下Google Reader,还有很多类似的软件。透过这类软件也展示了Atom格式的主要使用场景,即内容发布者提供符合Atom格式的XML文件然后由内容消费者使用联合软件(如Google Reader)来订阅。

ATOM联合技术的新宠 二

Atom模型中的元素

今天我特意做了一张大图作为开始,就是想让大家对Atom的元素有一个整体的印象。其中的*表示出现0次或多次,?表示出现0次或1次,没有任何标记的表示必须出现1次而且只能出现1次。

从图中不难看出Atom的元素(除了atomContent之外)都是用来包含元数据(meta data)的。元数据就是用来描述数据的数据,在Atom中就是指用来描述Feed或Entry的数据。例如,atomAuthor就是用来描述Feed或Entry的作者的,而作者对于Feed或Entry来说就是元数据。只有atomContent用来包含数据本身。

到了现在Atom模型已经清晰的呈现在我们的面前了,也该是看一看真正的atom文档的时候了。单击这里,看到了吧,实际上Atom文档就是一个格式良好的XML文档,仔细的感受吧。

在下一篇中我将介绍Google Reader,看看它是怎么处理Atom文档的。

ATOM联合技术的新宠 一

我要保持沉没了,多从自身找找原因,思考一下为什么会成这个样子。好了让糟糕的心情见鬼去吧!我们继续昨天的话题,讨论一下ATOM是如何定义单信息和联合信息的。

Atom Syndication Format描述了两种类型的Atom文档,即Feed文档和Entry文档,分别对应着联合信息和单信息。Entry文档可以单独使用,也可以联合起来形成Feed文档。

下面的图描述了这种关系:

Feed文档和Entry文档的关系

Solo L的博客网志发布了

咳,最近比较忙,火气也比较大,搞的团队的气氛也比较紧张。不过今天我的博客还是发布了,这到底是一件让人高兴的事情。

我发布这个博客网志的初衷就是想和朋友们分享彼此的快乐,分享彼此的悲伤,使我们的理想不在凄美,生活不在惨淡。

那到底采用什么样的格式来发布自己的博客呢?考虑来考虑去,最后决定使用ATOM了。这是比较新的一种联合格式,正式的规范(Atom Syndication Format)在2005年7月15日才刚刚面世。

如果您也对这种联合格式感兴趣,可以查阅RFC4287

我对准确的模型非常在意,因此,在今后的几天之中将会讨论一下ATOM的模型,一起来看看它是怎么来联合内容的。

我们来看看RFC4287中对ATOM的描述:

Atom is an XML-based document format that describes lists of related information known as "feeds". Feeds are composed of a number of items, known as "entries", each with an extensible set of attached metadata.

从上面的描述中可以看出ATOM提供了一个模型,这个模型可以描述单信息和联合信息。

不妨假设Ii为单信息。这样就可以将n个单信息I1, ... ,Ii, ... ,In联合到一起,形成一个联合信息。

下一次我将讨论ATOM是如何定义单信息和联合信息的。

在今天结束之前,让我们来为这个ATOM系列确定一个好听点的名字,恩...,叫什么好呢?就叫 ATOM联合技术的新宠 吧!