2010-10-08 79 views
4

我有一個SharePoint問題,我需要一些幫助。我創建了一些自定義ItemStyles來格式化內容查詢Web部件(CQWP)的輸出,但我需要在輸出中插入「查看所有」按鈕。XSL - 從路徑字符串中刪除文件名

查看所有需要指向: 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漢森的帖子,這是解決該問題的代碼:

模板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> 

回答

4

執行此樣式表生成: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模板會對其自身進行遞歸調用。雖然仍然有「/」字符,但它會在斜槓之前吐出值,然後自行調用。當它到達最後一個時,它停止。

+0

這很完美! MOSS正在做一些奇怪的事情,所以我實際上很難將$ path變量傳遞給getURL模板,但希望我可以對其進行分類。 – MrFidge 2010-10-11 09:51:00

+1

不確定你是如何調用的,但''也有'@ select',所以不是我的例子,我把文本值放在元素中,你可以這樣做:' – 2010-10-11 17:33:24

+0

完美 - 工作,我會在代碼中編輯我的解決方案,謝謝! – MrFidge 2010-10-12 14:03:26

0

如果使用XSLT 2.0(或者更具體地說,XPath 2.0中),那麼你就應該能使用的替換功能,使用正則表達式來捕捉前的最後一個「/」的字符串: http://www.w3.org/TR/xpath-functions/#func-replace

不幸的是,「替換」在XSLT 1.0中不存在,因此它取決於您使用的XSLT處理器是否適用於您。

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()],'/') 
+0

嘿,這是我2-3天前對現有問題的解決方案! – 2010-10-08 16:01:48

+0

@Dimitre:好的,也許你是對的,我不知道。我想我已經發布了XSLT 1.0解決方案。我懶得搜索一個重複的標記... – 2010-10-08 16:10:12

+0

@Alejandro:就在兩天前我發佈了這個 - 我以爲你看到它:http://stackoverflow.com/questions/3862334/how-to-insert- text-with-xslt-v1-0-instead-of-using-an-xslt-v2-0-regex/3865747#3865747 – 2010-10-08 16:11:26

0

看到我的回答this question並使用相同的技術(@亞歷杭德羅的答案基本上覆制這個)。

+0

我覺得這個http://stackoverflow.com/questions/3116942/done-file-path-manipulation-in-xslt更合適,但是它是XSLT 2.0,我認爲它不算重複... – 2010-10-08 16:48:12

+0

@Alejandro:是的,我知道我在回答中提供了這種技術多次。 – 2010-10-08 17:08:23

+0

Hiya,需要一個XSLT 1.0解決方案 - 所以Alejandro的答案很有用。希望我們可以使用2.0,它會更簡單! – MrFidge 2010-10-11 09:49:52

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> 

Btw。爲什麼MS仍然不支持XSLT 2.0!,我在2007年看到人們抱怨回來 - 「

相關問題