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() <= 6]">
<xsl:sort select="pubDate" order="ascending"/>
<xsl:if test="string-length(rss/channel/item/title) <= $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) > $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()<=6]">
会将上下文节点更改为相应的 item
元素。所以在 for-each
语句中,你应该使用
<xsl:if test="string-length(title) <= 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() <= 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) > $allowable-length">
<xsl:text>...</xsl:text>
</xsl:if>
</a>
</li>
</xsl:template>
</xsl:stylesheet>
我有一个 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() <= 6]">
<xsl:sort select="pubDate" order="ascending"/>
<xsl:if test="string-length(rss/channel/item/title) <= $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) > $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()<=6]">
会将上下文节点更改为相应的 item
元素。所以在 for-each
语句中,你应该使用
<xsl:if test="string-length(title) <= 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() <= 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) > $allowable-length">
<xsl:text>...</xsl:text>
</xsl:if>
</a>
</li>
</xsl:template>
</xsl:stylesheet>