XSL - 从路径字符串中删除文件名

时间:2010-10-08 12:48:41

标签: xslt sharepoint-2007 substring

我遇到了一个需要帮助的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>

5 个答案:

答案 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的回答基本上复制了这个。)