2010-10-08 3 views
4

У меня проблема SharePoint, с которой мне нужна помощь. Я создаю некоторые пользовательские элементы ItemStyles для форматирования вывода веб-части запроса контента (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, но затем мне нужно найти способ использования подстроки после поиска LAST-косой черты в серии и обрезать осироченное имя файла.

Использование пост @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

+1

не уверен, как вы вызываете, но '' также имеет '@ select', поэтому вместо моего примера, где я помещаю текстовое значение внутри элемента, вы можете сделать это' ' –

+0

perfect - это сработало, я отредактирую код для своего решения и спасибо! – MrFidge

0

При использовании XSLT 2.0 (или более конкретно, XPath 2.0), то вы должны быть в состоянии использовать функцию замены, используя регулярные выражения, чтобы захватить подстроку до последнего «/»: http://www.w3.org/TR/xpath-functions/#func-replace

К сожалению, «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 дней назад! –

+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-вместо-use-an-xslt-v2-0-regex/3865747 # 3865747 –

0

См. Мой ответ this question и используйте ту же технику (ответ Алехандро в основном копирует это).

+0

Я думаю, что это http://stackoverflow.com/questions/3116942/done-file-path-manipulations-in-xslt более подходит, но это XSLT 2.0, и я не думаю, что он считается дубликатом ... – 2010-10-08 16:48:12

+0

@Alejandro: Да, я знаю, что я предоставил эту технику в своих ответах много раз. –

+0

Hiya, нужно решение XSLT 1.0, поэтому ответ Алехандро был полезен. Хотелось бы использовать 2.0, это было бы намного проще! – MrFidge

2

данного решения не способен обрабатывать URL, без имени файла и расширения в конце (Путь к папке)

я изменил идеи выше, чтобы включить эту Aswell ...

<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 году. -0-