XSLT修剪文本长度并显示省略号

时间:2015-01-05 12:37:32

标签: xslt

我有一个RSS提要(下面的链接),我想限制标题节点中返回的文本长度

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

所以我添加了限制参数并将其设置为20

然后我添加了几个测试语句来检查标题节点长度是否大于/小于20。

我遇到的问题是小于测试总是输出 - 即使标题大于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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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个孩子。