XSLT не работает, когда я включаю xmlns = «http://www.sitemaps.org/schemas/sitemap/0.9»

Моя карта сайта Google хорошо отображается через XSLT без xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9" в <urlset> элемент, однако, когда он включен, мой оператор 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>
12 голосов | спросил Julian 1 +04002010-10-01T06:19:17+04:00312010bEurope/MoscowFri, 01 Oct 2010 06:19:17 +0400 2010, 06:19:17

2 ответа


0
  

Моя карта сайта Google хорошо отображается   XSLT нормально без   xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"   однако в элементе <urlset>   когда включено, мое foreach утверждение   не работает и ничего не делает в   шаблон

Это часто задаваемые вопросы .

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>
ответил Dimitre Novatchev 1 +04002010-10-01T06:36:03+04:00312010bEurope/MoscowFri, 01 Oct 2010 06:36:03 +0400 2010, 06:36:03
0

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 уже есть.

ответил Luke Schafer 1 +04002010-10-01T06:37:53+04:00312010bEurope/MoscowFri, 01 Oct 2010 06:37:53 +0400 2010, 06:37:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132