15

私のGoogleサイトマップは、<urlset>要素にxmlns = "http://www.sitemaps.org/schemas/sitemap/0.9"がなくても、XSLTを介して正常にレンダリングされますが、含まれていると、foreachステートメントが機能せず、何もレンダリングされません。テンプレート内。私のコードは以下です。ご協力いただきありがとうございます。

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

2 に答える 2

19

xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 私のGoogleサイトマップは、要素にinがなくても、XSLTを介して正常にレンダリングされます <urlset>が、含まれていると、foreachステートメントが機能せず、テンプレートに何もレンダリングされません。

これはFAQです。

XPathは、接頭辞のない名前を「名前空間なし」に属するものとして扱います。"http://www.sitemaps.org/schemas/sitemap/0.9"ただし、提供されたドキュメントの要素は名前空間に属します-ではありません"no namespace"

したがって、次のXPath式はノードをまったく選択しません。

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>
于 2010-10-01T02:36:03.300 に答える
3

xpathには、プレフィックスとして名前空間が必要です。

{http://www.sitemaps.org/schemas/sitemap/0.9}urlset

xmlns:x = "http://www.sitemaps.org/schemas/sitemap/0.9"の場合は、次を使用できます。

x:urlset

このページはhttp://msdn.microsoft.com/en-us/library/ms950779.aspxに役立つようです

編集:私はそれを投稿し、xslを使用してプレフィックスを定義する方法の例をフォローアップするつもりでしたが、Dimitreはすでに持っています。

于 2010-10-01T02:37:53.497 に答える