XSLT trim 文本长度并显示省略号

XSLT trim length of text and show ellipsis

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

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

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

然后我添加了一些测试语句来检查标题节点的长度是否 greater/less 而不是 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>

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 个子节点。

这不起作用的主要原因是 for-each 内的 XPath 将相对于 item,但您的路径从 rss.[=14 开始=]

您还可以通过消除重复来显着清理此 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>