事情是这样,首页上我放了一个通知的webpart,可是在实际使用中,发现,通知的征文部分太长,首页显得乱七八糟,很影响美观,于是想能不能把正文部分只显示50个或者100个字,剩下的用“…”省略号表示,并且产生一个“更多内容”的链接。以前用javascript做过,现在想用SPD来做。
在网上搜了很久,在MOSS中如何限制标题在首页上显示的长度?,这篇文章做了很好的解释,原文节选如下:
****************************淫荡的分割线*****************************
在Sharepoint designer中,有一项神奇的功能,可以将MOSS的库和列表转换成XSLT数据视图,借助于XSLT,我们可以灵活的控制内容展示的形式。
比如,我们想对这个列表的标题的字数加以限制,当字数<=12时,则显示全部的标题,如果字数>12,则截取前面的9个字,并在后面加上...
在SPD中找到我们插入页面的库或列表,右键,选择转换成XSLT试图。
对于列表,选择列表的标题,对应的XSL代码为:
<xsl:value-of disable-output-escaping="no" select="@Title" />
将代码替换为:
<xsl:if test="string-length(@Title)<=12"> 判断如果标题的字符串长度是否<=12
<xsl:value-of disable-output-escaping="no" select="@Title" /> 显示完整标题:select="@Title"
</xsl:if>
<xsl:if test="string-length(@Title)>12"> 判断如果标题的字符串长度是否>12
<xsl:value-of select="substring(string(@Title),1,9)" />... 显示标题的前9个字符,并在后面加上 ...
</xsl:if>
对于文档库,select的值不是标题,而是将文件名处理后的标题,代码如下:
<xsl:value-of select="ddwrt:UrlBaseName(string(@LinkFilename))" />
我们需要将对应的代码修改如下:
<xsl:if test="string-length(@LinkFilename)<=12">
<xsl:value-of select="ddwrt:UrlBaseName(string(@LinkFilename))" />
</xsl:if>
<xsl:if test="string-length(@LinkFilename)>12">
<xsl:value-of select="substring(ddwrt:UrlBaseName(string(@LinkFilename)),1,9)" />...
</xsl:if>
美中不足的是,我发现代码中对于字符串的计数是不分全角半角的,统统按照一个计算,这样的话,如果标题或文件名中如果包含了半角的字母或数字,所显示的结果就不会如我们的想象一样,是一个固定的长度,不过,对于标题过长从而换行导致的布局问题,总算是解决了!
****************************淫荡的分割线*****************************
但是,在如上操作中,发现几个问题:
1.提示说:属性值中不能使用字符 '<'
实体引用 |
描述 |
< |
小于号或开的尖括号(<) |
> |
大于号或闭的尖括号(>) |
& |
& 号 |
' |
撇号或单引号(') |
" |
引号或双引号('') |
问题就出在<xsl:if test="string-length(@Title)<=12"> 这里的“<”小于号上,“<”替换。
注意,必须含有“;”分号。
2.<xsl:value-of select="substring(string(@Title),1,9)" />在字段截取上
例子里用的是标题,实际中我用的是正文@Body。我想截取正文中的前100个字
<xsl:value-of select="substring(string(@Title),1,100)" />
但是截取出来的文字绝对不够100个字。为了把字数减少方便找出原因,我将语句改为substring(string(@Title),1,20),想截出20个字。保存后问题马上来了,整个default页面无法浏览,警告什么“缺少</ZoneTemplate>”。。。找不到问题所在,只能从别的地方考了一个default过来,再试,还是这个问题。。。无语。。。
突然想到,当我将正文用纯文本格式显示的时候,正文前有一串形如
<div class="Externalclass1B45BC7AD7B34D8390C62ED67FC8652C"> <div>
的html代码,当用RTF格式显示的时候,这串代码隐藏,但在截取时还是会将字符个数计算在内。这就导致了截取20个字符的时候,把不完整的标签带了进去,浏览器在解析default页面的html是发现这个未闭合的标签,抛出错误。同时,这也是导致正文显示不足100个字的原因。能不能把这串代码排除,还没想到办法,目前只能靠数,得出这串代码长度是63位,因此截取的长度应该是63+100=163。要把这串html截掉,否则会重复出现。。。因此截取语句为
<xsl:value-of select="substring(string(@Title),64,163)" />
同时,判断Body长度的语句也要做相应修改。
但是,这里问题又来了,为了方便看,我把截取的长度变成3位,意思就是说我要截取3个字,语句为<xsl:value-of select="substring(string(@Title),1,66)" />
在SPD中能显示3个字,到了web上只能显示2个字,这是什么原因。。。没想明白,只能多加一位,取3个字,就取到67。
最后得出的答案是
截取100个字
<xsl:value-of select="substring(string(@Title),64,164)" />
至此,可以说基本满足目的,剩下的就是界面的美化了。