2010-10-01 7 views
12

Meine Google-Sitemap macht gut durch XSLT gut ohne die xmlns = "http: //www.sitemaps. org/schemas/sitemap/0.9 "in der < Urlset> -Element, aber wenn es enthalten ist, funktioniert meine Foreach-Anweisung nicht und nichts rendert in der Vorlage. Mein Code ist unten. Danke für Ihre Hilfe.XSLT funktioniert nicht, wenn ich 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

Gute Frage (+1). Siehe meine Antwort für eine Erklärung und für eine vollständige Lösung. –

Antwort

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

Dies ist eine FAQ.

XPath behandelt jeden Namen ohne Präfix als "kein Namespace". Die Elemente im bereitgestellten Dokument gehören jedoch zum Namespace "http://www.sitemaps.org/schemas/sitemap/0.9" - nicht zu "no namespace".

Daher ist die folgende XPath-Ausdruck wählen keine Knoten überhaupt:

urlset/url 

Lösung:

Definieren des "http://www.sitemaps.org/schemas/sitemap/0.9" Namensraum im XSLT Stylesheet und einem Präfix, um es in Verbindung bringen. Verwenden Sie dann dieses Präfix mit allen Namen, die an einem beliebigen XPath-Ausdruck teilnehmen.

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

wenn diese Transformation auf der mitgelieferten XML-Dokument angewendet wird:

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

es produziert korrekt folgendes Ergebnis:

<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

Ausgezeichnete Antwort! Vielen Dank! Ihre Erklärung war sehr klar und die Lösung hat funktioniert! – Julian

+0

Wissen Sie, wie Sie die {site_url} in eine anklickbare URL umwandeln können. Wenn ich den folgenden Code ausprobiere, erhalte ich den folgenden Fehler - "XML Parsing Error: nicht wohlgeformt Location: sitename.com/sitemapxsl Zeilennummer 194, Spalte 26: "mit einem Pfeil zur ersten linken Klammer der xsl-Syntax - Code wie folgt -" " – Julian

+1

@Julian: Dies ist eine andere FAQ :). Verwenden:' ' –

Verwandte Themen