0

我正在为一个朋友维护一个不是我创建的网站。它使用 Symphony CMS,而我的 XML/XSLT/XPATH 知识充其量只是初级知识。有一个页面有一个 Instagram 提要部分,该部分最近停止显示图像,现在只显示 Alt 文本“Instagram”。

该模板的相关代码是:

<section>
  ...
  <xsl:for-each select="instagram/rss/channel/item[position() &lt; '5']">
    <div class="one-quarter left">
      <img class="border" src="{image/url}" alt="Instagram" />
    </div>
  </xsl:for-each>
  ...
</section>

本节的数据源蓝图是动态 XML,它来自https://websta.me/rss/n/vubrew上的 RSS 提要:

<rss xmlns:admin="http://webns.net/mvcb/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" version="2.0">
  <channel>
    <title>vubrew's feed - WEBSTA</title>
    <link>https://widget.websta.me/rss/n/vubrew</link>
    <description>
      WEBSTA's RSS Feed - Websta is the best Instagram Web Viewer
    </description>
    <dc:language>en</dc:language>
    <dc:creator>WEBSTA</dc:creator>
    <pubDate>Fri, 19 Aug 2016 07:01:29 +0900</pubDate>
    <atom:link href="https://widget.websta.me/rss/n/vubrew" rel="self" type="application/rss+xml"/>
    <item>
      <pubDate>Fri, 19 Aug 2016 00:32:44 +0900</pubDate>
      <title>Fri, 19 Aug 2016 00:32:44 +0900</title>
      <description>
        Join Veterans United, Pit Sisters, and The Jed Fund tonight from 6 to 9 for the Mission Pawsible: TAILS kickoff event! There will be a food truck, raffles, and a silent auction, and $1 from every pint sold during the event will be donated to this great cause.
      </description>
      <atom:link href="https://websta.me/p/1319648356028404744_761313738"/>
      <media:thumbnail url="https://scontent.cdninstagram.com/t51.2885-15/s640x640/sh0.08/e35/13696890_1570626159907795_1849825203_n.jpg?ig_cache_key=MTMxOTY0ODM1NjAyODQwNDc0NA%3D%3D.2"/>
      <guid>https://websta.me/p/1319648356028404744_761313738</guid>
    </item>
    <item>...</item>
    ...
  </channel>
</rss>

据我所知,WEBSTA 似乎最近更改了他们的 XML 提要的格式,这样{image/url}就不能再选择现在出现在medianamespace下的图像了media:thumbnail/url

我在 Symphony 管理控制面板中为 Instagram 数据源添加了新media命名空间,其 URI 为http://search.yahoo.com/mrss/. (RSS 提要中指定的其他内容已经存在。)

我尝试将图像源更改为{thumbnail/url}产生相同结果(只是 Alt 文本)并{media:thumbnail/url}导致出现有关无效命名空间前缀的错误:

XSLTProcessor::transformToXml():
    Undefined namespace prefix
    xmlXPathCompiledEval: evaluation failed
    XPath evaluation returned no result.

尝试在浏览器中提取mediaURIhttp://search.yahoo.com/mrss/重定向到 Yahoo 的主页,我发现一些信息表明该规范现在可能在其他地方维护,但我似乎无法找到替代 URI。所以我想知道这是否是问题的一部分?

诚然,我的 XML / XSLT / XPATH 知识很薄,所以我不确定我是否只是没有正确指定元素,或者问题是否与可能已移动的媒体名称空间 URI 有关。我还考虑过我可能需要以某种方式刷新 Symphony 以识别数据源中的新命名空间,但我没有看到任何可以实现这一点的东西。

我会很感激任何见解。

4

1 回答 1

1

我将从 XSLT 的角度给出答案,因为我不了解 Symphony,但通常您会在根xsl:stylesheet元素上声明名称空间。例如,在这种特殊情况下,它看起来像这样:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0" 
                xmlns:media="http://search.yahoo.com/mrss/"
                exclude-result-prefixes="media">

然后,在 XSLT 中的任何位置使用该命名空间应该没有问题,因此您的<img>标记将看起来是 this(注意这url是一个属性,因此您需要@相应地使用前缀)

<img class="border" src="{media:thumbnail/@url}" alt="Instagram" />

请注意,如果您仅限于在 Symphony 中更改模板,您实际上也可以在模板本身上声明命名空间。因此,您可以像这样编写模板:

<xsl:template match="/" xmlns:media="http://search.yahoo.com/mrss/">
    <section>
        <xsl:for-each select="rss/channel/item[position() &lt; 5]">
            <div class="one-quarter left">
                <img class="border" src="{media:thumbnail/@url}" alt="Instagram" />
            </div>
        </xsl:for-each>
    </section>
</xsl:template>
于 2016-08-19T07:59:08.347 回答