Ответ 1
Моя карта сайта Google хорошо просматривается XSLT штраф без
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
в элементе<urlset>
, однако когда включено, мое выражение foreach не работает и ничего не делает в шаблон
Это FAQ.
XPath рассматривает любое неподписанное имя как принадлежащее к "без пространства имен". Однако элементы в предоставленном документе принадлежат пространству имен "http://www.sitemaps.org/schemas/sitemap/0.9"
- не к "no namespace"
.
Следовательно, следующее выражение XPath вообще не выбирает node:
urlset/url
Решение
Определите пространство имен "http://www.sitemaps.org/schemas/sitemap/0.9"
в таблице стилей XSLT и сопоставьте ему префикс. Затем используйте этот префикс со всеми именами, которые участвуют в любом выражении 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>