XSL按日期解析和排序

时间:2013-07-23 03:02:52

标签: xslt xml-parsing

我有这个用于渲染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:&lt;/b&gt; '),'&lt;/div&gt;')" />
    <xsl:variable name="itemPubDate" select="substring-before(substring-after($DescriptionField, 'itemPubDate:&lt;/b&gt; '),'&lt;/div&gt;')" />
    <xsl:variable name="itemDescription" select="substring-before(substring-after($DescriptionField, 'itemDescription:&lt;/b&gt; '),'&lt;/div&gt;')" />
    <xsl:variable name="itemHTML" select="substring-after($DescriptionField, 'itemHTML:&lt;/b&gt; ')" />
    <xsl:variable name="itemLink" select="substring-before(substring-after($DescriptionField, 'href=&quot;'),'&quot;')" />
    <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

排序

1 个答案:

答案 0 :(得分:2)

您应该能够在RSSMainTemplate.body模板中的for-each中应用排序。 关键是提取日期片段(年,月,日),并分别对每一个进行排序

<xsl:for-each select="$Rows">
       <xsl:sort select="substring(substring-before(substring-after(description, 'itemPubDate:&lt;b&gt;'),'&lt;/b&gt;'),7,4)"  />
       <xsl:sort select="substring(substring-before(substring-after(description, 'itemPubDate:&lt;b&gt;'),'&lt;/b&gt;'),4,2)"  />
       <xsl:sort select="substring(substring-before(substring-after(description, 'itemPubDate:&lt;b&gt;'),'&lt;/b&gt;'),1,2)"  />

我也注意到你的select语句中有一个问题是从div中提取信息(基于你的示例XML),你有

<xsl:variable name="itemPubDate" select="substring-before(substring-after($DescriptionField, 'itemPubDate:&lt;/b&gt; '),'&lt;/div&gt;')" />

应该是

<xsl:variable name="itemPubDate" select="substring-before(substring-after($DescriptionField, 'itemPubDate:&lt;b&gt;'),'&lt;/b&gt;')" />