2013-07-04 3 views
6

Я не могу найти точный ответ на этот вопрос, поэтому я надеюсь, что кто-то поможет мне здесь.Подстрока после последнего символа в xslt

У меня есть строка, и я хочу получить подстроку после последнего '.'. Я использую xslt 1.0.

Как это делается? Это мой код.

<xsl:choose> 
    <xsl:otherwise> 
     <xsl:attribute name="class">method txt-align-left case-names</xsl:attribute>&#160; 
     <xsl:value-of select="./@name"/> // this prints a string eg: 'something1.something2.something3' 
    </xsl:otherwise> 
</xsl:choose> 

Когда я вставляю предложенный код, я получаю сообщение об ошибке. «Разбор таблицы стилей XSLT не удался».

ответ

14

Я не могу придумать способ сделать это с помощью одного выражения в XSLT 1.0, но вы можете сделать это с помощью рекурсивного шаблона:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
    <n> 
     <xsl:call-template name="GetLastSegment"> 
     <xsl:with-param name="value" select="'something1.something2.something3'" /> 
     <xsl:with-param name="separator" select="'.'" /> 
     </xsl:call-template> 
    </n> 
    </xsl:template> 

    <xsl:template name="GetLastSegment"> 
    <xsl:param name="value" /> 
    <xsl:param name="separator" select="'.'" /> 

    <xsl:choose> 
     <xsl:when test="contains($value, $separator)"> 
     <xsl:call-template name="GetLastSegment"> 
      <xsl:with-param name="value" select="substring-after($value, $separator)" /> 
      <xsl:with-param name="separator" select="$separator" /> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$value" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Результат:

<n>something3</n> 
+0

Вы бы сделать это: ' 'Если вы можете ' t получить это, чтобы работать, не могли бы вы изменить свой вопрос, чтобы включить все соответствующие части вашего XSLT? – JLRishe

0

I решена она

<xsl:call-template name="GetLastSegment"> 
<xsl:with-param name="value" select="./@name" /> 
</xsl:call-template> 

не нужна

<xsl:with-param name="separator" value="'.'" /> 

в шаблоне вызова

3

Я сделал то же поведение с XSL: функция - использование тогда немного проще:

<xsl:function name="ns:substring-after-last" as="xs:string" xmlns:ns="yourNamespace"> 
    <xsl:param name="value" as="xs:string?"/> 
    <xsl:param name="separator" as="xs:string"/>   
    <xsl:choose> 
     <xsl:when test="contains($value, $separator)"> 
      <xsl:value-of select="ns:substring-after-last(substring-after($value, $separator), $separator)" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$value" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:function> 

И вы можете позвонить непосредственно в стоимости из :

<xsl:value-of select="ns:substring-after-last(.,'=')" xmlns:ns="yourNamespace"/> 
+0

Где находится пространство имен dp? 'dp: substring-after-last (substring-after ($ value, $ separator), $ separator)" ' – Hayra

+0

Спасибо Hayra. В префиксе пространства имен действительно была ошибка копирования/вставки. Я только что обновил код. – FiveO

+0

, который namespace - ns? – zypro

1

Вот решение с помощью EXSLT str:tokenize:

<xsl:if test="substring($string, string-length($string)) != '.'"><xsl:value-of select="str:tokenize($string, '.')[last()]" /></xsl:if> 

(if здесь, потому что, если ваша строка заканчивается разделителем, разметить не возвращает пустую строку)

Смежные вопросы