2015-03-26 5 views
-2

Я не знаю, как название этот пост ..Сравнение значений XSL в массиве

Я хочу сравнить PubDate между рядами

Желаемая Выход: Печатает только PubDate, если оно отличается от предыдущая строка pubDate. (моя подстрочная функция возвращает декабрь 2014, январь 2015 г. и т. д.)

В настоящее время у меня есть установленный для печати pubDate каждый раз. Я просто не могу понять, как сравнить значение между строками ... пожалуйста, помогите!

фрагмент кода:

<xsl:template match="item"> 
<xsl:variable name="Rows" select="channel/item"/> 
<xsl:variable name="RowCount" select="count($Rows)"/> 
<xsl:variable name="item_link" select="link"/> 
<xsl:variable name="item_title" select="description"/> 

<xsl:value-of select="$Rows"/> 
<xsl:variable name="CurPosition" select="position()" /> 
<xsl:variable name="PrevPosition" select="position()-1" /> 
<xsl:variable name="RssFeedLink" select="$rss_WebPartID" /> 
<xsl:variable name="CurrentElement" select="concat($RssFeedLink,$CurPosition)" /> 
<xsl:if test="not(substring(pubDate,3,9) = 0)"> 
    <div align="center"> 
    <hr/> 
    <xsl:value-of select="substring(pubDate,3,9)" disable-output-escaping="yes"/> 
    </div> 
</xsl:if> 
<li> 
    <a href="{$item_link}" title="{$item_title}"> 
    <xsl:variable name="SafeHtml"> 
     <xsl:call-template name="GetSafeHtml"> 
     <xsl:with-param name="Html" select="title"/> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="$SafeHtml" disable-output-escaping="yes"/> 
    </a> 
</li> 

Вот полный код для тех, кто хочет его:

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" 
      version="1.0" exclude-result-prefixes="xsl ddwrt msxsl rssaggwrt" 
      xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" 
      xmlns:rssaggwrt="http://schemas.microsoft.com/WebParts/v3/rssagg/runtime" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      xmlns:rssFeed="urn:schemas-microsoft-com:sharepoint:RSSAggregatorWebPart"> 

<xsl:param name="rss_FeedLimit">30</xsl:param> 
<xsl:param name="rss_ExpandFeed">true</xsl:param> 
<xsl:param name="rss_LCID">1033</xsl:param> 
<xsl:param name="rss_WebPartID">RSS_Viewer_WebPart</xsl:param> 
<xsl:param name="rss_alignValue">left</xsl:param> 
<xsl:param name="rss_IsDesignMode">True</xsl:param> 

    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="/"> 
<xsl:variable name="Rows" select="channel/item"/> 
<xsl:variable name="RowCount" select="count($Rows)"/> 
<div> 
    <xsl:apply-templates select="rss/channel"/> 
</div> 
</xsl:template> 
<xsl:template match="rss/channel"> 
<xsl:variable name="link" select="link"/> 
<xsl:variable name="description" select="description"/> 

<ul> 
    <xsl:apply-templates select="item"/> 
</ul> 
</xsl:template> 


<xsl:template match="item"> 
<xsl:variable name="Rows" select="channel/item"/> 
<xsl:variable name="RowCount" select="count($Rows)"/> 
<xsl:variable name="item_link" select="link"/> 
<xsl:variable name="item_title" select="description"/> 

<xsl:value-of select="$Rows"/> 
<xsl:variable name="CurPosition" select="position()" /> 
<xsl:variable name="RssFeedLink" select="$rss_WebPartID" /> 
<xsl:variable name="CurrentElement" select="concat($RssFeedLink,$CurPosition)" /> 
<xsl:if test="not(substring(pubDate,3,9) = 0)"> 
    <div align="center"> 
    <hr/> 
    <xsl:value-of select="substring(pubDate,3,9)" disable-output-escaping="yes"/> 
    </div> 
</xsl:if> 
<li> 
    <a href="{$item_link}" title="{$item_title}"> 
    <xsl:variable name="SafeHtml"> 
     <xsl:call-template name="GetSafeHtml"> 
     <xsl:with-param name="Html" select="title"/> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="$SafeHtml" disable-output-escaping="yes"/> 
    </a> 
</li> 




</xsl:template> 

<xsl:template name="GetSafeHtml"> 
    <xsl:param name="Html"/> 
    <xsl:choose> 
    <xsl:when test="$rss_IsDesignMode = 'True'"> 
    <xsl:value-of select="$Html"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="rssaggwrt:MakeSafe($Html)"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 
+1

См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Я не знаю ответа, когда не знаю, в чем вопрос. Попробуйте добавить вход и желаемый выход. –

+1

Форматирование не имеет к этому никакого отношения. Вы не показываете нам входной XML, так что здесь никто не может помочь вам. Если вы это сделаете, я надеюсь, вы быстро получите ответ. – bjimba

ответ

0

Если вы хотите проверить значение предыдущих «строка» вы можете использовать preceding-sibling оси оператор.

Таким образом, вместо того, чтобы писать это ....

<xsl:if test="not(substring(pubDate,3,9) = 0)"> 

Написать это ...

<xsl:if test="not(substring(pubDate,3,9) = 0) and not(pubDate = preceding-sibling::item[1]/pubDate)"> 

Обратите внимание на использование [1] здесь. Выполнение preceding-sibling вернет все узлы, предшествующие текущему, и вы хотите только первый.

Также обратите внимание, что вы могли бы попытаться написать это ...

<xsl:if test="not(substring(pubDate,3,9) = 0) and pubDate != preceding-sibling::item[1]/pubDate"> 

Но это не будет работать для первого item элемента, потому что выражение, чтобы быть правдой предшествующие родственным бы существовать.

И, наконец, это действительно будет работать, если элементы item находятся в pub-date. Лучшим подходом было бы рассмотреть эту проблему группировки и группировать элементы по дате. Для XSLT 1.0 вы должны использовать метод, называемый Muenchian Grouping.

+0

Muenchian Grouping был ключом. Большое спасибо за предложение – gruff

Смежные вопросы