如何在XSLT样式表中声明命名空间
2010-07-16 12:26
295 查看
考虑以下两段代码:
这是一段标准的sitemap文件,当然为简单点,我把url的两个子节点去掉了,但总体上不影响我们使用。
这是一段转换sitemap的代码,再次偷懒,把输出的表格的内容给过滤掉了一部分。要完整版的看本站右下角的sitemap文件。
以上这两段代码能够正确的进行转换,没有什么问题。现在我们给xml文件加上一个命名空间(事实上现在大部分XML文件都存在这样那样的命名空间,sitemap也不例外):
OK,现在应该不能正确转换了,body部分变成空的了。很明显无法匹配urlset节点了。因为现在所有sitemap文件下的节点都是带命名空间的,不能再这样直接使用了。都要带上命名空间前缀才能正确匹配。
当然,要使用命名空间,首先要声明它。在xsl:stylesheet标签中再声明一个命名空间:
本文采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议 进行许可。
首发于本人博客:http://www.caixw.com/archives/how-to-declare-namespace-in-xslt-stylesheet.html
<urlset> <url> <loc>http://www.caixw.com/archives/1.html</loc> <lastmod>2010-05-20T16:30:59+08:00</lastmod> </url> <url> <loc>http://www.caixw.com/archives/2.html</loc> <lastmod>2010-05-20T16:35:59+08:00</lastmod> </url> </urlset>
这是一段标准的sitemap文件,当然为简单点,我把url的两个子节点去掉了,但总体上不影响我们使用。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/Transform"> <xsl:output method="html" encoding="utf-8" indent="yes" version="1.0" /> <xsl:template match="/" xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9"> <html> <head> <title>XML Sitemap</title> </head> <body> <xsl:apply-templates select="urlset" /> </body> </html> </xsl:template> <xsl:template match="urlset"> <table> <xsl:for-each select="url"> <tr> <td><a> <xsl:attribute name="href"><xsl:value-of select="loc" /></xsl:attribute> <xsl:value-of select="loc" /> </a></td> <td><xsl:value-of select="substring-before(lastmod, 'T')" /></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
这是一段转换sitemap的代码,再次偷懒,把输出的表格的内容给过滤掉了一部分。要完整版的看本站右下角的sitemap文件。
以上这两段代码能够正确的进行转换,没有什么问题。现在我们给xml文件加上一个命名空间(事实上现在大部分XML文件都存在这样那样的命名空间,sitemap也不例外):
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <!-- ... --> </url> </urlset>
OK,现在应该不能正确转换了,body部分变成空的了。很明显无法匹配urlset节点了。因为现在所有sitemap文件下的节点都是带命名空间的,不能再这样直接使用了。都要带上命名空间前缀才能正确匹配。
当然,要使用命名空间,首先要声明它。在xsl:stylesheet标签中再声明一个命名空间:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/Transform" xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9">
本文采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议 进行许可。
首发于本人博客:http://www.caixw.com/archives/how-to-declare-namespace-in-xslt-stylesheet.html
相关文章推荐
- 如何在XSLT样式表中声明命名空间
- 如何在XSLT样式表中声明命名空间
- 如何在XSLT样式表中声明命名空间
- XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)
- XML命名空间以及它们如何影响XPath和XSLT(Extreme XML)
- 二 : using声明、using指示用于嵌套命名空间时的作用域
- 关于Oracle数据库如何查询非当前用户名命名空间下的表不需要写ower直接from 表名
- 如何解决WIN10中,进入本地组策略时出现“命名空间已经被定义为存储中另一文件的目标命名空间”
- 在Razor中如何引入命名空间?("import namespace in razor view")
- 如何在重构时,批量重命名程序集的命名空间
- 二 : using声明、using指示用于嵌套命名空间时的作用域
- XSLT遇到的命名空间问题
- 如何为VS创建排序并移除不必要的命名空间引用-Is it possible to create a shortcut for removing unused usings into a class?
- php命名空间如何引入一个变量类名?
- 设计原则:如何应对模型的复杂性 之 更细粒度的组织命名空间
- 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
- C++ Primer学习笔记6 标准库类型(命名空间的using声明、标准库string类型)
- 如何解决“xxxxxx是“命名空间”,但此处被当做“类型”来使用”的问题
- 没办法前置声明命名空间里的东西
- 使用前向声明 另外一个命名空间中的类