更正Google多语言站点地图/ xhtml:链接的XSLT语法

时间:2016-08-16 23:51:07

标签: xml xslt sitemap

我有一个使用xhtml:link标记跟随Google's specifications for multilingual sitemaps的多语言网站的XML站点地图。

语法如下:

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

但那不起作用。

在Google多语种站点地图中循环/选择xhtml:link代码的正确XSLT语法是什么?

3 个答案:

答案 0 :(得分:2)

我无法使用此代码识别/引用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>

答案 1 :(得分:1)

我想要和BaronGrivet(带有xhtml:link标记的站点地图在浏览器中很好地显示)相同的东西。我在GitHub上找到了Pedro Borges的xsl模板,效果很好。

该模板使用xsl:for-each(而不是使用xsl:apply-templates遍历每个xhtml链接)(应用模板处理当前节点的所有子节点)。

佩德罗模板中的关键部分是:

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

Pedro的模板具有比我需要的功能更多的功能(例如,可以列出视频),但是编辑模板以完成我需要的操作很容易。

答案 2 :(得分:0)

您已经在xhtml:link节点中(在xsl:for-each中)。使用

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

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