在Symphony CMS中使用XSLT在RSS Feed XML命名空间中选择数据

时间:2016-08-19 00:11:06

标签: xml xslt xpath rss symphony-cms

我为朋友维护一个网站,我没有创建。它使用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 Feed的格式,因此{image/url}不再适用于选择现在显示在media命名空间下的图像media:thumbnail/url

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

我尝试将图片源更改为{thumbnail/url},这会产生相同的结果(只是Alt文本)和{media:thumbnail/url},这会导致出现有关无效名称空间前缀的错误:< / p>

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

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

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

我很欣赏任何见解。

1 个答案:

答案 0 :(得分:1)

我将从XSLT的角度给出答案,因为我不了解Symphony,但通常您会在根// Check if id is send, and delete from session accordingly if(isset($_GET['id'])){ $productID = $_GET['id']; if( $index = array_search($productID, $_SESSION['product']) ) { $_SESSION['product'][$index] = null; unset($_SESSION['product'][$index]); header('Location: http://www.web.nl/_extern/web/offerte.php'); } } if(count($_SESSION['product']) == 0){ echo 'No products added'; }else{ foreach($offertecr as $product){ $offerte_imgs = $product['images']; // Get image parameters of the article $offertepic = json_decode($offerte_imgs); // Split the parameters apart if($offertepic->{'image_intro'} != ''){ $image = 'cms/'.$offertepic->{'image_intro'}; }else{ $image = 'http://www.web.nl/_extern/web/cms/images/Producten/Untitled-7.jpg'; } if($product['id'] != ''){ if (strlen($product['introtext']) > 100){ $shortcat = substr($product['introtext'], 0, 100) . '...'; }else{ $shortcat = $product['introtext']; } $deleteLink = "offerte.php?id=".$product['id']; $offerteoverzicht .= ' <div class="row productofferte"> <a href="producten/'.$product['alias'].'.html"> <div class="col-md-6 offerteimg"> <img style="border:1px solid #ddd;" src="'.$image.'"> </div> </a> <div class="desc"> <a style="color:#2d4160;" href="producten/'.$product['alias'].'.html"><p style="font-weight:bold;">'.$product['title'].' </a> <a href="'.$deleteLink.'"> <i class="fa fa-times" aria-hidden="true"></i> </a> </p> <p>'.$shortcat.'</p> </div> </div>'; } } } echo $offerteoverzicht; 元素上声明名称空间。例如,在这种特殊情况下,它看起来像这样:

xsl:stylesheet

然后,在XSLT中的任何位置使用该命名空间应该没有问题,因此您的<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"> 标记会看起来这样(注意<img>是一个属性,因此您需要使用{{ 1}}相应的前缀)

url

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

@