2010-10-01 10 views
12

Mon sitemap Google fonctionne bien avec XSLT sans les xmlns = "http: //www.sitemaps. org/schemas/sitemap/0,9 "dans l'élément < urlset>, mais lorsqu'il est inclus, mon instruction foreach ne fonctionne pas et rien ne s'affiche dans le modèle. Mon code est ci-dessous. Merci de votre aide.XSLT ne fonctionne pas lorsque j'inclue xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9"

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> 
+0

Bonne question (+1). Voir ma réponse pour une explication et pour une solution complète. –

Répondre

17

My Google sitemap renders well through XSLT fine without the xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" in the <urlset> element, however when included, my foreach statement doesn't work and nothing renders in the template

C'est une FAQ. XPath traite n'importe quel nom non préfixé comme appartenant à "aucun espace de nom". Toutefois, les éléments dans le document fourni appartiennent à l'espace de noms "http://www.sitemaps.org/schemas/sitemap/0.9" - pas à "no namespace".

Par conséquent, l'expression XPath suivante ne sélectionne pas un nœud du tout:

urlset/url 

Solution:

Définir l'espace de noms "http://www.sitemaps.org/schemas/sitemap/0.9" dans la feuille de style XSLT et associer un préfixe à elle. Utilisez ensuite ce préfixe avec tous les noms qui participent à une expression 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> 

lorsque cette transformation est appliquée sur le document XML fourni:

<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> 

il produit correctement le résultat suivant:

<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> 
+0

Excellente réponse! Merci! Votre explication était très claire et la solution a fonctionné! – Julian

+0

Savez-vous comment faire de {site_url} une URL cliquable? Lorsque j'essaie le code ci-dessous, j'obtiens l'erreur suivante - "Erreur d'analyse XML: pas bien formé Emplacement: nom de site.com/sitemapxsl Ligne numéro 194, Colonne 26: "avec une flèche pointant vers la première accolade gauche de la syntaxe xsl - Code comme suit -" " – Julian

+1

@Julian: Ceci est une autre FAQ :). Utilisation:' ' –