我有这个用于渲染RSS提要的现有xsl
除了标题之外,其他所有内容都从描述字段中解析出来
下面的代码片段就是目前的工作方式。它工作但没有项目的设置顺序。
如何修改我所拥有的内容,以便按itemPubDate
对项目进行排序。
示例itemPubDate
值为06/26/2013
。
<xsl:template name="RSSMainTemplate.body">
<xsl:param name="Rows" />
<xsl:param name="RowCount" />
<xsl:for-each select="$Rows">
<xsl:variable name="CurPosition" select="position()" />
<xsl:variable name="RssFeedLink" select="$rss_ID" />
<xsl:variable name="CurrentElement" select="concat($RssFeedLink,$CurPosition)" />
<xsl:call-template name="RSSDescTransform1">
<xsl:with-param name="DescriptionField" select="description" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="RSSDescTransform1">
<xsl:param name="DescriptionField" />
<xsl:variable name="itemTitle" select="title" />
<xsl:variable name="itemAuthor" select="substring-before(substring-after($DescriptionField, 'itemAuthor:</b> '),'</div>')" />
<xsl:variable name="itemPubDate" select="substring-before(substring-after($DescriptionField, 'itemPubDate:</b> '),'</div>')" />
<xsl:variable name="itemDescription" select="substring-before(substring-after($DescriptionField, 'itemDescription:</b> '),'</div>')" />
<xsl:variable name="itemHTML" select="substring-after($DescriptionField, 'itemHTML:</b> ')" />
<xsl:variable name="itemLink" select="substring-before(substring-after($DescriptionField, 'href="'),'"')" />
<xsl:call-template name="RSSDescTransform2">
<xsl:with-param name="itemTitle" select="$itemTitle" />
<xsl:with-param name="itemAuthor" select="$itemAuthor" />
<xsl:with-param name="itemPubDate" select="$itemPubDate" />
<xsl:with-param name="itemDescription" select="$itemDescription" />
<xsl:with-param name="itemLink" select="$itemLink" />
<xsl:with-param name="itemHTML" select="$itemHTML" /></xsl:call-template>
</xsl:template>
完整XSL here
我目前没有输入样本,但它看起来像
<item>
<title>lorem ipsum</title>
<description>
<![CDATA[
<div>
itemAuthor:<b>John</b>
itemPubDate:<b>06/26/2013</b>
...
</div>
]]>
<description>
</item>
<item>
...
</item>
输出几乎相同,只是用一些CSS设置。
XSL现在不会导致任何错误。我只想让项目按itemPubDate
答案 0 :(得分:2)
您应该能够在RSSMainTemplate.body模板中的for-each中应用排序。 关键是提取日期片段(年,月,日),并分别对每一个进行排序
<xsl:for-each select="$Rows">
<xsl:sort select="substring(substring-before(substring-after(description, 'itemPubDate:<b>'),'</b>'),7,4)" />
<xsl:sort select="substring(substring-before(substring-after(description, 'itemPubDate:<b>'),'</b>'),4,2)" />
<xsl:sort select="substring(substring-before(substring-after(description, 'itemPubDate:<b>'),'</b>'),1,2)" />
我也注意到你的select语句中有一个问题是从div中提取信息(基于你的示例XML),你有
<xsl:variable name="itemPubDate" select="substring-before(substring-after($DescriptionField, 'itemPubDate:</b> '),'</div>')" />
应该是
<xsl:variable name="itemPubDate" select="substring-before(substring-after($DescriptionField, 'itemPubDate:<b>'),'</b>')" />