2015-03-11 3 views
0

У меня есть канал RSS, который изменяется регулярно (в том же формате, разные данные), и мне нужно применить преобразование к нему, чтобы получить список элементов из него с помощью тегов. Проблема в том, что я никогда не знаю, в какой позиции находится элемент с правильными тегами. Пример: если бы я генерировал карусель из этой страницы, которая связана с «теорией», мне нужно было бы вытащить «предметы» из список элементов в RSS, которые имеют соответствующие теги, затем добавьте класс «active» к элементу с классом «элемент строки newsitem».XSLT с RSS-каналами

Я понимаю, что я мог бы сделать это очень легко с помощью JQuery ->

$(".newsitem.row.item").first().attr("class","newsitem row item active"); 

Но, если это возможно, я хотел бы сохранить шаг и генерировать HTML с активным классом на месте.

<rss xmlns:atom=" ... " version="2.0"> 
    <channel> 
    <title>Latest News</title> 
     <link>http://...</link> 
     <description>Latest News</description> 
    <atom:link href="..." rel="self"/> 
    <language>en</language> 
    <copyright>Copyright (c) 2015</copyright> 
    <lastBuildDate>Sat, 25 Apr 2015 23:39:40 -0500</lastBuildDate> 
    <item> 
     <title>TITLE FOR FIRST ITEM</title> 
     <link>LINK FOR FIRST ITEM</link> 
     <description>DESCRIPTION</description> 
     <pubDate>Sat, 25 Apr 2015 23:39:40 -0500</pubDate> 
     <guid>GUID</guid> 
     <category>gallery</category> 
     <category>events</category> 
    <item> 
     <title>TITLE FOR NEXT ITEM</title> 
     <link>LINK FOR NEXT ITEM</link> 
     <description>DESCRIPTION ...</description> 
     <pubDate>Tue, 10 Mar 2015 20:59:12 -0500</pubDate> 
     <guid>GUID ...</guid> 
     <category>architecture</category> 
     <category>class acts</category> 
     <category>competitions</category> 
     <category>feature</category> 
     <category>global college</category> 
     <category>graduate work</category> 
     <category>health systems &amp; design</category> 
     <category>honors</category> 
     <category>rss</category> 
     <category>wellness</category> 
    </item> 
    ... 
    <item> 
     <title>TITLE FOR THE NTH ITEM</title> 
     <link>LINK FOR THE NTH ITEM</link> 
     <description>DESCRIPTION ...</description> 
     <pubDate>Tue, 10 Mar 2015 20:52:45 -0500</pubDate> 
     <guid>GUID ...</guid> 
     <category>applied creativity</category> 
     <category>gallery</category> 
     <category>coa gallery</category> 
     <category>graduate work</category> 
     <category>research</category> 
     <category>rss</category> 
     <category>technology</category> 
     <category>theory-philosophy</category> 
     <category>video</category> 
     <category>visualization</category> 
    </item> 
</channel> 
</rss> 

Мой код:

<xsl:stylesheet xmlns:xsl="..." version="1.0"> 

<xsl:template match="/"> 
<div class="row"> 
    <div class="col-md-12 banner_image vanish"> 
     <div class="carousel newsitems slide" data-carousel-delay="8000" id="banner-latest-85695"> 
      <div class="carousel-inner"> 
       <xsl:apply-templates select="//item"/> 
      </div> 
      <a class="carousel-control left" data-slide="next" href="#banner-latest-85695" title="Previous News Item"></a> 
      <a class="carousel-control right" data-slide="next" href="#banner-latest-85695" title="Next News Item"></a> 
     </div> 
    </div> 
</div> 
</xsl:template> 

<xsl:template match="item|text()"> 
     <xsl:if test="category[contains(text(),'theory')]"> 
     <div class="newsitem row item"> 
      <xsl:if test="position() = ?"> <!-- what position test do I use? --> 
       <xsl:attribute name="class">newsitem row item active</xsl:attribute> 
      </xsl:if> 
      <div class="image span"> 
       <img> 
        <xsl:attribute name="src"> 
         <xsl:value-of select="carousel"/> 
        </xsl:attribute> 
        <xsl:attribute name="alt"> 
         <xsl:value-of select="title"/> 
        </xsl:attribute> 
       </img> 
      </div> 
      <div class="details span"> 
       <h2> 
        <a> 
         <xsl:attribute name="href"> 
          <xsl:value-of select="link"/> 
         </xsl:attribute> 
         <xsl:value-of select="title"/> 
        </a> 
       </h2> 
       <div class="publication-date"> 
        <span>posted</span> 
        <xsl:value-of select="pubDate"/> 
       </div> 
       <div class="description"> 
        <xsl:value-of select="description"/> 
       </div> 
      </div> 
     </div> 
    </xsl:if> 
</xsl:template> 

Это работает, если первый элемент в RSS поток содержит тег Я ищу. Что я здесь упускаю?

** EDITED ПРОЯСНИТЬ ССЫЛКИ Заменено "..."

+0

http://stackoverflow.com/help/someone-answers –

ответ

0

Ваш вопрос не совсем ясен. Если вы хотите, чтобы выбрать элемент (или элементы) с помощью «метки» он содержит, вы должны сделать что-то вроде:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <div> 
     <xsl:apply-templates select="rss/channel/item[tag2]"/> 
    </div> 
</xsl:template> 

<xsl:template match="item"> 
    <div> 
     <span> 
      <xsl:value-of select="value"/> 
     </span> 
    </div> 
</xsl:template> 

</xsl:stylesheet> 

Здесь мы ищем пункт/с дочерний элемент с именем tag2. Применяя это к следующему тестового входа:

<rss> 
    <channel> 
     <item> 
     <tag1/> 
     <value>100</value> 
     </item> 
     <item> 
     <tag2/> 
     <value>200</value> 
     </item> 
     <item> 
     <tag2/> 
     <value>201</value> 
     </item> 
     <item> 
     <tag3/> 
     <value>300</value> 
     </item> 
    </channel> 
</rss> 

производит результат:

<?xml version="1.0" encoding="UTF-8"?> 
<div> 
    <div> 
     <span>200</span> 
    </div> 
    <div> 
     <span>201</span> 
    </div> 
</div>