2013-07-23 50 views
0

排序我有這個現有的XSL是在渲染一個RSS feed使用。
除了標題外,其他所有內容都從說明字段中解析出來。
下面的代碼片段是目前如何完成的。它可以工作,但沒有設置項目的順序。 如何修改我擁有的項目,然後按itemPubDate排序。 樣品itemPubDate值爲06/26/2013XSL解析和按日期

<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

+0

如果沒有輸入XML和慾望輸出的例子真的很難說問題是什麼。你可以用'用'的''但與調用,事實上,你有兩個層次'的'讓我覺得有你的XSL等問題。 – 2013-07-23 03:12:19

+0

@LegoStormtroopr已添加附加信息 – kei

回答

2

排序的項目您應該能夠應用排序您的,每個RSSMainTemplate.body模板中。 關鍵是提取日期件(年,月,日),並分別對每一個排序

<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;')" /> 
+1

此工作,謝謝!其實select語句是正確的,我只是輸入錯誤。它應該看起來像'

itemPubDate: 22/07/2013
'。我相應地修改了你的答案。 – kei