Правильный синтаксис XSLT для многоязычных карт сайта Google / xhtml: ссылка

У меня есть карта сайта в формате XML для многоязычного сайта, соответствующая спецификациям Google для многоязычных карт сайта используя теги xhtml:link.

Синтаксис выглядит так:

        <url>
          <loc>http://www.example.com/url-segment/</loc>
          <xhtml:link rel="alternate" hreflang="en" href="http://www.example.com/url-segment/" />
          <xhtml:link rel="alternate" hreflang="de" href="http://www.example.com/de/url-segment/" />
          <xhtml:link rel="alternate" hreflang="fr" href="http://www.example.com/fr/url-segment/" />
          <lastmod>2016-08-09T00:41:57+12:00</lastmod>
          <changefreq>weekly</changefreq>
          <priority>0.9</priority>
        </url>

Я пытаюсь сделать это читабельным для клиента, используя шаблон XSLT следующим образом:

  <xsl:for-each select="sitemap:urlset/sitemap:url">
    <tr>
      <td>
        <xsl:variable name="itemURL">
          <xsl:value-of select="sitemap:loc"/>
        </xsl:variable>
      </td>
    <td>
      <xsl:value-of select="concat(sitemap:priority*100,'%')"/>
    </td>
    <td>
      <xsl:value-of select="concat(translate(substring(sitemap:changefreq, 1, 1),concat($lower, $upper),concat($upper, $lower)),substring(sitemap:changefreq, 2))"/>
     </td>
     <td>
       <xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))"/>
     </td>
   </tr>
 </xsl:for-each>

Что работает без тегов xhtml:link. Но я не уверен, как правильно ссылаться на теги xhtml:link. Я пробовал что-то вроде этого:

<xsl:for-each select="xhtml:link">
  <tr>
    <td>
      <xsl:value-of select="xhtml:link@href"/>
    </td>
    <td>
      <xsl:value-of select="xhtml:link@hreflang"/>
    </td>
    <td colspan="2"></td>
  </tr>
</xsl:for-each>

Но это не работает.

Каков правильный синтаксис XSLT для перебора / выбора тегов xhtml:link в многоязычных картах сайта Google?


person BaronGrivet    schedule 16.08.2016    source источник


Ответы (3)


Я не мог заставить его распознавать / ссылаться на узел xhtml:link, используя этот код:

<xsl:for-each select="xhtml:link">

В конце концов, этот подход сработал для меня:

<xsl:for-each select="./*[@rel='alternate']">
  <tr>
    <td>
      <xsl:value-of select="@href"/>
    </td>
    <td>
      <xsl:value-of select="@hreflang"/>
    </td>
  </tr>
</xsl:for-each>
person BaronGrivet    schedule 23.08.2016

Я хотел то же, что и BaronGrivet (карта сайта с тегами xhtml: link, которая хорошо отображается в браузере). Я нашел xsl-шаблон Педро Борхеса на GitHub, который отлично работает.

Вместо того, чтобы использовать xsl:for-each для перебора каждой ссылки xhtml, этот шаблон использует xsl:apply-templates (apply-templates обрабатывает все дочерние узлы текущего узла}.

Ключевые части шаблона Педро:

<xsl:template match="/">
    <html>
        <body>
            …
            <xsl:apply-templates/>
            …
        </body>
    </html>
</xsl:template>

<xsl:template match="sitemap:urlset">
    …
    <xsl:for-each select="sitemap:url">
        …
        <xsl:apply-templates select="xhtml:*"/>
        …
    </xsl:for-each>
    …
</xsl:template>

<xsl:template match="xhtml:link">
    <xsl:variable name="altloc">
        <xsl:value-of select="@href"/>
    </xsl:variable>
    <p>
        Alt language version: 
        <a href="{$altloc}">
            <xsl:value-of select="@href"/> 
        </a> 
        –
        <xsl:if test="@hreflang">
            <xsl:value-of select="@hreflang"/> 
        </xsl:if> 
    </p>
</xsl:template>

Шаблон Педро имеет гораздо больше возможностей, чем мне нужно (например, может отображать видео), но было достаточно легко отредактировать шаблон, чтобы делать то, что мне нужно.

person Rich DeBourke    schedule 21.06.2018

Вы уже находитесь в xhtml:link узле (в xsl: for-each). Использовать

<xsl:value-of select="@href"/>

а также

<xsl:value-of select="@hreflang"/>
person Joel M. Lamsen    schedule 17.08.2016