我遇到了一个需要帮助的SharePoint问题。我正在创建一些自定义ItemStyles来格式化内容查询Webpart(CQWP)的输出,但我需要在输出中插入“查看全部”按钮。
查看所有需要指向的内容: http://www.site.com/subsite/doclibrary1/Forms/AllItems.aspx
文档库中的所有单个文件都具有以下链接: http://www.site.com/subsite/doclibrary1/FileName.doc
所以我需要的是一些XSL函数来从字符串的末尾剥离FileName.doc。
我尝试使用substring-before($ variable,'。')来摆脱.doc,但我需要找到一种方法来使用substring-after来搜索系列中的最后正斜杠并截断孤立的文件名。
使用@Mads Hansen的帖子,这是解决问题的代码:
ItemStyle.xsl中的模板
<xsl:template name="ImpDocs" match="Row[@Style='ImpDocs']" mode="itemstyle">
<xsl:variable name="SafeLinkUrl">
<xsl:call-template name="OuterTemplate.GetSafeLink">
<xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="ViewAllLink">
<xsl:call-template name="OuterTemplate.getCleanURL">
<xsl:with-param name="path" select="@LinkUrl"/>
</xsl:call-template>
</xsl:variable>
<div class="DocViewAll">
<a href="{$ViewAllLink}Forms/AllItems.aspx" title="View all">View All</a>
<!--Any other code you need for your custom ItemStyle here-->
</div>
</xsl:template>
ContentQueryMain.xsl中的模板
<xsl:template name="OuterTemplate.getCleanURL">
<xsl:param name="path" />
<xsl:choose>
<xsl:when test="contains($path,'/')">
<xsl:value-of select="substring-before($path,'/')" />
<xsl:text>/</xsl:text>
<xsl:call-template name="OuterTemplate.getCleanURL">
<xsl:with-param name="path" select="substring-after($path,'/')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
答案 0 :(得分:5)
执行此样式表会产生:http://www.site.com/subsite/doclibrary1/
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:call-template name="getURL">
<xsl:with-param name="path">http://www.site.com/subsite/doclibrary1/FileName.doc</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="getURL">
<xsl:param name="path" />
<xsl:choose>
<xsl:when test="contains($path,'/')">
<xsl:value-of select="substring-before($path,'/')" />
<xsl:text>/</xsl:text>
<xsl:call-template name="getURL">
<xsl:with-param name="path" select="substring-after($path,'/')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当字符串中有“/”字符时,getURL模板会对自身进行递归调用。虽然仍有“/”字符,但它会在斜杠之前吐出值,然后调用自身。当它到达最后一个时,它就会停止。
答案 1 :(得分:2)
给定的解决方案无法在没有文件名和扩展名的情况下处理url(文件夹的路径)
我改变了上面的想法以包括这个...
<xsl:template name="getPath">
<xsl:param name="url" />
<xsl:choose>
<xsl:when test="contains($url,'/')">
<xsl:value-of select="substring-before($url,'/')" />
<xsl:text>/</xsl:text>
<xsl:call-template name="getPath">
<xsl:with-param name="url" select="substring-after($url,'/')" />
</xsl:call-template>
</xsl:when >
<xsl:otherwise>
<xsl:if test="not(contains($url,'.'))">
<xsl:value-of select="$url" />
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
顺便说一下。为什么MS仍然不支持XSLT 2.0!我看到人们抱怨2007年的回合 - .-'
答案 2 :(得分:0)
如果您正在使用XSLT 2.0(或更具体地说,XPath 2.0),那么您应该能够使用replace函数,使用正则表达式捕获最后一个“/”之前的子字符串: http://www.w3.org/TR/xpath-functions/#func-replace
不幸的是,XSLT 1.0中不存在“替换”,因此它取决于您使用的XSLT处理器是否适用于您。
答案 3 :(得分:0)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="url">
<xsl:variable name="vReverseUrl">
<xsl:call-template name="reverse"/>
</xsl:variable>
<xsl:call-template name="reverse">
<xsl:with-param name="pString"
select="substring-after($vReverseUrl,'/')"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="reverse">
<xsl:param name="pString" select="."/>
<xsl:if test="$pString">
<xsl:call-template name="reverse">
<xsl:with-param name="pString" select="substring($pString,2)"/>
</xsl:call-template>
<xsl:value-of select="substring($pString,1,1)"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<url>http://www.site.com/subsite/doclibrary1/FileName.doc</url>
输出:
http://www.site.com/subsite/doclibrary1
一行XPath 2.0:
string-join(tokenize(url,'/')[position()!=last()],'/')
答案 4 :(得分:0)
查看我对this question的回答并使用相同的技巧(@ Alejandro的回答基本上复制了这个。)