xml xslt sitemap xml-namespaces google-sitemap

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.