我有一个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() <= 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>
答案 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() <= 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>
答案 1 :(得分:2)
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
个孩子。