XSLT no funciona cuando incluyo xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xml-namespaces google-sitemap (2)
Mi sitemap de Google funciona bien a través de XSLT sin el xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9" en el elemento <urlset>; sin embargo, cuando se incluye, mi enunciado foreach no funciona y no se renderiza nada. en la plantilla. Mi código esta debajo Gracias por tu ayuda.
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>
Mi sitemap de Google funciona bien a través de XSLT sin el
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
en el elemento<urlset>
; sin embargo, cuando se incluye, mi enunciado foreach no funciona y no se renderiza nada. en la plantilla
Esta es una pregunta frecuente
XPath trata cualquier nombre no prefijado como perteneciente a "sin espacio de nombres". Sin embargo, los elementos en el documento proporcionado pertenecen al espacio de nombres "http://www.sitemaps.org/schemas/sitemap/0.9"
- no a "no namespace"
.
Por lo tanto, la siguiente expresión XPath no selecciona ningún nodo:
urlset/url
Solución :
Defina el espacio de nombres "http://www.sitemaps.org/schemas/sitemap/0.9"
en la hoja de estilos XSLT y asóciele un prefijo. Luego use este prefijo con todos los nombres que participan en cualquier expresión 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>
cuando esta transformación se aplica en el documento XML proporcionado :
<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>
produce correctamente el siguiente resultado :
<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>
el xpath necesitará el espacio de nombre como prefijo, por ejemplo
{http://www.sitemaps.org/schemas/sitemap/0.9}urlset
si fuera xmlns: x = "http://www.sitemaps.org/schemas/sitemap/0.9" podrías usar
x:urlset
parece que esta página ayudará a http://msdn.microsoft.com/en-us/library/ms950779.aspx
EDITAR: Iba a publicar eso y seguir con un ejemplo de cómo usar xsl para definir el prefijo, pero Dimitre ya lo hizo.