2015-01-05 59 views
1

我有一個RSS feed(下面的鏈接),我想限制文本的長度在標題節點返回XSLT修剪長度

RSS訂閱: https://news.google.co.uk/news?pz=1&cf=all&ned=uk&hl=en&q=uk&output=rss

所以我有追加的參數爲極限,並將其設定爲20

然後我已增加了幾個測試語句的檢查,如果標題節點長度大於/小於20

我的問題是,以下比測試總是o utputs - 即使標題大於20!

<xsl:stylesheet version="1.0"> 
    <xsl:output method="html"/> 
    <xsl:template match="/"> 
    <xsl:param name="allowable-length" select="20"/> 
    <ul> 
     <xsl:for-each select="rss/channel/item[position() &lt;= 6]"> 
     <xsl:sort select="pubDate" order="ascending"/> 
     <xsl:if test="string-length(rss/channel/item/title) &lt;= $allowable-length"> 
      <li class="news"> 
      <a href="{link}" title="{title}"> 
       <xsl:value-of select="title"/> 
      </a> 
      </li> 
     </xsl:if> 
     <xsl:if test="string-length(rss/channel/item/title) &gt; $allowable-length"> 
      <li class="news"> 
      <a href="{link}" title="{title}"> 
       <xsl:value-of select="substring(title, 1, 20)"/> 
...   </a> 
      </li> 
     </xsl:if> 
     </xsl:for-each> 
    </ul> 
    </xsl:template> 
</xsl:stylesheet> 
+0

而不是爲什麼不使用? 它的工作方式如果,否則,如果,否則 – Saurav

+0

我試過了,它也沒有工作,否則塊永遠不會被解僱。測試必須有問題,你的想法是什麼? – Scott

回答

3

這不起作用的主要原因是for-each內的XPath將與item相關,但您將開始路徑回到rss

您還可以通過消除重複來清理此XSLT。試試這個。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 

    <xsl:param name="allowable-length" select="20"/> 

    <xsl:template match="/"> 
    <ul> 
     <xsl:apply-templates select="rss/channel/item[position() &lt;= 6]"> 
     <xsl:sort select="pubDate" order="ascending"/> 
     </xsl:apply-templates> 
    </ul> 
    </xsl:template> 

    <xsl:template match="item"> 
    <li class="news"> 
     <a href="{link}" title="{title}"> 
     <xsl:value-of select="substring(title, 1, $allowable-length)"/> 
     <xsl:if test="string-length(title) &gt; $allowable-length"> 
      <xsl:text>...</xsl:text> 
     </xsl:if> 
     </a> 
    </li> 
    </xsl:template> 
</xsl:stylesheet> 
+0

在這些情況下,我確保我測試一些簡單的調試正確的事情。我插入了[[xsl:value-of select =「字符串長度(標題)」/>]',它顯示了[[0]],這顯然是不正確的。然後我立即看到了問題。 – usr2564301

+0

@Jongware我不知道我按照你的意思。你是否說上面的樣式表有問題?是因爲缺少'xsl'命名空間嗎? – JLRishe

+0

@JLRishe感謝explinations,我確實試圖回到根RSS路徑而不是相對路徑。感謝您發佈重構代碼 - 我對此很新,所以總是很高興看到更好的做法! – Scott

2

xsl:for-each語句

<xsl:for-each select="rss/channel/item[position()&lt;=6]"> 

將上下文節點改變到相應item元件。所以for-each語句中,你應該使用

<xsl:if test="string-length(title) &lt;= 20"> 

表達rss/channel/item產生一個空節點集,因爲item沒有任何rss孩子。

+0

謝謝你,這工作完美,節點路徑是畢竟的問題:) – Scott