XSL - удаление имени файла из строки пути - PullRequest
4 голосов
/ 08 октября 2010

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

5 голосов
/ 08 октября 2010

Выполнение этой таблицы стилей приводит к: 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 выполняет рекурсивный вызов сам при наличии символов "/" в строке.В то время как все еще есть символы "/", он выплевывает значения перед косой чертой, а затем вызывает себя.Когда он достигает последнего, он останавливается.

2 голосов
/ 24 сентября 2012

Данные решения не могут обрабатывать 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 году. - '

0 голосов
/ 08 октября 2010

См. Мой ответ на этот вопрос и используйте ту же технику (ответ @ Alejandro по существу копирует это).

0 голосов
/ 08 октября 2010

Эта таблица стилей:

<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 голосов
/ 08 октября 2010

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

К сожалению, в XSLT 1.0 не было «замены», поэтому от того, какой процессор XSLT вы используете, зависит, будет ли это работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...