15

我的 Google 站点地图可以通过 XSLT 很好地呈现,而 < urlset > 元素中没有 xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ,但是当包含时,我的 foreach 语句不起作用并且没有任何呈现在模板中。我的代码在下面。谢谢你的帮助。

XML

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>{site_url}</loc>
<lastmod>{current_time format="%Y-%m-%d"}</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
</urlset>

XSL

<xsl:template match="/">
<html>
<body>
<h2>Sitemap</h2>
<table border="1">
<tr bgcolor="#9acd32">
  <th>Location</th>
  <th>Last Modified</th>
  <th>Update Frequency</th>
  <th>Priority</th>
</tr>
<xsl:for-each select="urlset/url">
<tr>
  <td><xsl:value-of select="loc"/></td>
  <td><xsl:value-of select="lastmod"/></td>
  <td><xsl:value-of select="changefreq"/></td>
  <td><xsl:value-of select="priority"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
4

2 回答 2

19

我的谷歌站点地图通过 XSLT 很好地呈现,没有 xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 元素<urlset>,但是当包含时,我的 foreach 语句不起作用并且模板中没有任何呈现

这是一个常见问题解答

XPath 将任何无前缀的名称视为属于“无命名空间”。但是,提供的文档中的元素属于"http://www.sitemaps.org/schemas/sitemap/0.9"命名空间——而不是"no namespace".

因此,以下 XPath 表达式根本不选择任何节点:

urlset/url

解决方案

在 XSLT 样式表中定义"http://www.sitemaps.org/schemas/sitemap/0.9"名称空间并为其关联一个前缀。然后将此前缀与参与任何 XPath 表达式的所有名称一起使用。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:s="http://www.sitemaps.org/schemas/sitemap/0.9"
 exclude-result-prefixes="s"
>

 <xsl:template match="/">
  <html>
    <body>
      <h2>Sitemap</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Location</th>
          <th>Last Modified</th>
          <th>Update Frequency</th>
          <th>Priority</th>
        </tr>
        <xsl:for-each select="s:urlset/s:url">
          <tr>
            <td><xsl:value-of select="s:loc"/></td>
            <td><xsl:value-of select="s:lastmod"/></td>
            <td><xsl:value-of select="s:changefreq"/></td>
            <td><xsl:value-of select="s:priority"/></td>
          </tr>
        </xsl:for-each>
      </table>
    </body>
  </html>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>{site_url}</loc>
        <lastmod>{current_time format="%Y-%m-%d"}</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>

它正确地产生以下结果

<html>
   <body>
      <h2>Sitemap</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>Location</th>
            <th>Last Modified</th>
            <th>Update Frequency</th>
            <th>Priority</th>
         </tr>
         <tr>
            <td>{site_url}</td>
            <td>{current_time format="%Y-%m-%d"}</td>
            <td>monthly</td>
            <td>0.5</td>
         </tr>
      </table>
   </body>
</html>
于 2010-10-01T02:36:03.300 回答
3

xpath 将需要命名空间作为前缀,例如

{http://www.sitemaps.org/schemas/sitemap/0.9}urlset

如果是 xmlns:x="http://www.sitemaps.org/schemas/sitemap/0.9" 你可以使用

x:urlset

看起来这个页面会帮助http://msdn.microsoft.com/en-us/library/ms950779.aspx

编辑:我打算发布它并跟进一个如何使用 xsl 定义前缀的示例,但 Dimitre 已经有了。

于 2010-10-01T02:37:53.497 回答