许多RSS源都使用了rdf命名空间,因此在进行XSLT转换时必须明确指定命名空间。
以华尔街日报(http://cn.wsj.com/gbrsstest/rssall.xml?rand=7711219990160316)为例,进行分析
添加该目标后,获取的数据内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/">
<channel rdf:about="http://cn.wsj.com">
<title>所有新闻--华尔街日报</title>
其中在开头部分已经定义了rdf、dc、sy、taxo四个命名空间,另外xmlns="http://purl.org/rss/1.0/"作为缺省命名空间因此在书写配置文件时也需要把这些空间都指定上,尤其是缺省命名空间,由于没有特别指定名字,因此需要自己起一个名字,通常可以用default
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:default="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="1.0">
<xsl:template match="/">
<news>
<xsl:for-each select="//default:item">
<item>
<datetime>
<xsl:value-of select="default:pubDate/text()" />
</datetime>
<url>
<xsl:value-of select="default:link/text()" />
</url>
<title>
<xsl:value-of select="default:title/text()" />
</title>
</item>
</xsl:for-each>
</news>
</xsl:template>
</xsl:stylesheet>
此时就可以获得正确的解析转换。