用XSLT欣赏所有世博印章

中国2010年上海世博会吸引了众人的关注,五彩缤纷的“世博印章”更是令人趋之若鹜。作为2010年世博会的两大创新项目之一的网上世博会的“我的护照”栏目,可以看到大部分场馆的世博印章图片。那么,能否一次性看到所有的世博印章呢?

Fiddler观察网络流量可以得知:每个片区有一个xml配置文件包含了片区内各场馆的名称和代码。例如,A片区的xml配置文件是:

<!-- http://www.expo.cn/configs/tencent/azone.xml -->
<root>
<p1>
<cname1>中国国家馆</cname1>
<cname2>中国省区市联合馆 </cname2>
<cname3>澳门馆</cname3>
<cname4>香港馆</cname4>
<cname5>尼泊尔馆</cname5>
<cname6>阿联酋馆</cname6>
<!-- omit -->
</p1>
<p2>
<name1>China Pavilion</name1>
<name2>Chinese Provinces Joint Pavilion</name2>
<name3>Macao Pavilion</name3>
<name4>Hongkong Pavilion</name4>
<name5>Nepal Pavilion</name5>
<name6>UAE Pavilion</name6>
<!-- omit -->
</p2>
<p3>
<uid1>11100001</uid1>
<uid2>11100005</uid2>
<uid3>11200001</uid3>
<uid4>11200002</uid4>
<uid5>11200003</uid5>
<uid6>11200004</uid6>
<!-- omit -->
</p3>
</root>

而世博印章的图片URI,可以根据uid字段构造。例如,中国国家馆的印章URI是:http://www.expo.cn/images/HZ/11100001.png。

程序处理xml有很多种方法,其中一种好用的方法是XSLT。XSLT是一种声明性的、基于XML的语言,用于将一个或多个xml文档转换成另一些xml文档。XSLT经常被用于将xml数据转换成可以作为网页显示的html或xhtml文档。

因此,我们要做的是:编写一个xslt文件,将网上世博会某一片区的xml配置文件,转换成能显示出该片区所有场馆“世博印章”的html文档。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">

<xsl:output method="html" indent="yes" encoding="UTF-8"/>

<xsl:template match="/root">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>世博印章</title>
</head>
<body>
<h1>世博印章</h1>
<table>
<thead><tr><td>uid</td><td>中文名称</td><td>英文名称</td><td>世博印章</td></tr></thead>
<tbody>
<xsl:apply-templates select="p3/*"/>
</tbody>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="p3/*">
<xsl:variable name="n" select="substring(local-name(),4)"/>
<xsl:variable name="cname" select="/root/p1/*[local-name()=concat('cname',$n)]"/>
<xsl:variable name="name" select="/root/p2/*[local-name()=concat('name',$n)]"/>
<tr>
<td><xsl:value-of select="."/></td>
<td><a><xsl:attribute name="href">http://www.expo.cn/pavilion/<xsl:value-of select="."/>.html?l=cn</xsl:attribute><xsl:value-of select="$cname"/></a></td>
<td><a><xsl:attribute name="href">http://www.expo.cn/pavilion/<xsl:value-of select="."/>.html?l=en</xsl:attribute><xsl:value-of select="$name"/></a></td>
<td><img><xsl:attribute name="src">http://www.expo.cn/images/HZ/<xsl:value-of select="."/>.png</xsl:attribute><xsl:attribute name="alt"><xsl:value-of select="$cname"/> 世博印章</xsl:attribute></img></td>
</tr>
</xsl:template>

</xsl:stylesheet>

欣赏各场馆所有世博印章的方法

  1. 下载片区的xml配置文件: A片区 B片区 C片区 D片区 E片区
  2. 将上述xslt文件保存为expo.xsl,请用utf-8编码保存。
  3. 用记事本编辑xml配置文件,在开头加上一行:
    <?xml-stylesheet href="expo.xsl" type="text/xsl"?>
  4. 用浏览器打开xml配置文件,即可看到转换后的html文档,欣赏该片区所有场馆的世博印章;有些世博印章无法显示(或显示为红叉),说明该场馆没有印章。

声明:本文只作技术讨论,不提供任何形式的世博印章打包下载。你用上述方法看到的世博印章,其著作权属于2010年上海世博会的组织者和参展方,因此不允许随意传播。