<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>xnotepad的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=xnotepad</link>
<description>xnotepad的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[如何在XSLT样式表中声明命名空间]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=xnotepad&amp;id=49358</link>
<author>xnotepad</author>
<pubDate>2010/7/14 12:40:16</pubDate>
<description><![CDATA[考虑以下两段代码： <pre class="prettyprint lang-xml"><ol><li><span class="tag">&lt;urlset&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;url&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;loc&gt;</span><span class="pln">http://www.caixw.com/archives/1.html</span><span class="tag">&lt;/loc&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;lastmod&gt;</span><span class="pln">2010-05-20T16:30:59+08:00</span><span class="tag">&lt;/lastmod&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/url&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;url&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;loc&gt;</span><span class="pln">http://www.caixw.com/archives/2.html</span><span class="tag">&lt;/loc&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;lastmod&gt;</span><span class="pln">2010-05-20T16:35:59+08:00</span><span class="tag">&lt;/lastmod&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/url&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/urlset&gt;</span></li></ol& gt;</pre> <p>这是一段标准的sitemap文件，当然为简单点，我把url的两个子节点去掉了，但总体上不影响我们使用。</p> <pre class="prettyprint lang-xsl"><ol><li><span class="tag">&lt;xsl:stylesheet</span><span class="pln"> </span><span class="atn">version</span><span class="pun">=</span><span class="atv">"1.0"</span><span class="pln"> </span><span class="atn">xmlns:xsl</span><span class="pun">=</span><span class="atv">"http://www.w3.org/1999/xsl/Transform"</span><span class="tag">&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;xsl:output</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"html"</span><span class="pln"> </span><span class="atn">encoding</span><span class="pun">=</span><span class="atv">"utf-8"</span><span class="pln"> </span><span class="atn">indent</span><span class="pun">=</span><span class="atv">"yes"</span><span class="pln"> </span><span class="atn">version</span><span class="pun">=</span><span class="atv">"1.0"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;xsl:template</span><span class="pln"> </span><span class="atn">match</span><span class="pun">=</span><span class="atv">"/"</span><span class="pln"> </span><span class="atn">xmlns:sm</span><span class="pun">=</span><span class="atv">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="tag">&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;html&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;head&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;title&gt;</span><span class="pln">XML Sitemap</span><span class="tag">&lt;/title&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/head&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;body&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;xsl:apply-templates</span><span class="pln"> </span><span class="atn">select</span><span class="pun">=</span><span class="atv">"urlset"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/body&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/html&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/xsl:template&gt;</span><span class="pln"></span></li><li><br></li><li><span class="tag">&lt;xsl:template</span><span class="pln"> </span><span class="atn">match</span><span class="pun">=</span><span class="atv">"urlset"</span><span class="tag">&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;table&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;xsl:for-each</span><span class="pln"> </span><span class="atn">select</span><span class="pun">=</span><span class="atv">"url"</span><span class="tag">&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;tr&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;td&gt;&lt;a&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;xsl:attribute</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"href"</span><span class="tag">&gt;&lt;xsl:value-of</span><span class="pln"> </span><span class="atn">select</span><span class="pun">=</span><span class="atv">"loc"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/xsl:attribute&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;xsl:value-of</span><span class="pln"> </span><span class="atn">select</span><span class="pun">=</span><span class="atv">"loc"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;/a&gt;&lt;/td&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; &nbsp; &nbsp; <span class="tag">&lt;td&gt;&lt;xsl:value-of</span><span class="pln"> </span><span class="atn">select</span><span class="pun">=</span><span class="atv">"substring-before(lastmod, 'T')"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/td&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/tr&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/xsl:for-each&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/table&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/xsl:template&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/xsl:stylesheet&gt;</span></li>& lt;/ol></pre> <p>这是一段转换sitemap的代码，再次偷懒，把输出的表格的内容给过滤掉了一部分。要完整版的看本站右下角的sitemap文件。</p> <p>以上这两段代码能够正确的进行转换，没有什么问题。现在我们给xml文件加上一个命名空间（事实上现在大部分XML文件都存在这样那样的命名空间，sitemap也不例外）：</p> <pre class="prettyprint lang-xml"><ol><li><span class="tag">&lt;urlset</span><span class="pln"> &nbsp;</span><span class="atn">xmlns</span><span class="pun">=</span><span class="atv">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="tag">&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;url&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="com">&lt;!-- ... --&gt;</span><span class="pln"></span></li><li>&nbsp; &nbsp; <span class="tag">&lt;/url&gt;</span><span class="pln"></span></li><li><span class="tag">&lt;/urlset&gt;</span></li></ol></pre> <p>OK，现在应该不能正确转换了，body部分变成空的了。很明显无法匹配urlset节点了。因为现在所有sitemap文件下的节点都是带命名空间的，不能再这样直接使用了。都要带上命名空间前缀才能正确匹配。</p> <p>当然，要使用命名空间，首先要声明它。在<q>xsl:stylesheet</q>标签中再声明一个命名空间：</p> <pre class="prettyprint lang-xsl"><ol><li><span class="tag">&lt;xsl:stylesheet</span><span class="pln"> </span><span class="atn">version</span><span class="pun">=</span><span class="atv">"1.0"</span><span class="pln"> </span><span class="atn">xmlns:xsl</span><span class="pun">=</span><span class="atv">"http://www.w3.org/1999/xsl/Transform"</span><span class="pln"> &nbsp;</span><span class="atn">xmlns:sitemap</span><span class="pun">=</span><span class="atv">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="tag">&gt;</span></li></ol></pre> <p>然后在所有原先匹配XML文件节点的都加上"sitemap"前缀： <br> <q>&lt;td&gt;&lt;xsl:value-of select="substring-before(<strong>sitemap:</strong>lastmod, 'T')" /&gt;</q> </p>
<p>原文在这里：<a href="http://www.caixw.com/archives/how-to-declare-namespace-in-xslt-stylesheet.html">http://www.caixw.com/archives/how-to-declare-namespace-in-xslt-stylesheet.html</a></p>]]></description>
</item>
</channel>
</rss>