中国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>
<?xml-stylesheet href="expo.xsl" type="text/xsl"?>声明:本文只作技术讨论,不提供任何形式的世博印章打包下载。你用上述方法看到的世博印章,其著作权属于2010年上海世博会的组织者和参展方,因此不允许随意传播。