Мне нужно найти последнее вхождение символа в элементе.
Например:
<mediaurl>http://www.blah.com/path/to/file/media.jpg</mediaurl>
Если я попытаюсь найти его с помощью substring-before(mediaurl, '.') и substring-after(mediaurl, '.'), то он, конечно же, совпадет по первой точке.
Как мне получить расширение файла? По сути, мне нужно получить имя файла и расширение из такого пути, но я не совсем понимаю, как это сделать с помощью XSLT.





Как насчет токенизации с помощью "/" и взять последний элемент из массива?
Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
Когда-то был скрипачом XSLT ... потерял связь сейчас. Но HTH
Если вы используете XSLT 2.0, это просто:
<xsl:variable name = "extension" select = "tokenize($filename, '\.')[last()]"/>
Если нет, то это немного сложнее. Есть хороший пример из Поваренная книга O'Reilly XSLT. Найдите «Токенизация строки».
Я считаю, что есть еще функция EXSLT, если она у вас есть.
Ниже приведен пример шаблона, который будет производить требуемый вывод в XSLT 1.0:
<xsl:template name = "getExtension">
<xsl:param name = "filename"/>
<xsl:choose>
<xsl:when test = "contains($filename, '.')">
<xsl:call-template name = "getExtension">
<xsl:with-param name = "filename" select = "substring-after($filename, '.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select = "$filename"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match = "/">
<xsl:call-template name = "getExtension">
<xsl:with-param name = "filename" select = "'http://www.blah.com/path/to/file/media.jpg'"/>
</xsl:call-template>
</xsl:template>
Для справки, эта проблема обычно называется «подстрокой после последней» в XSLT.
Не функция в xslt 1.0
Не является функцией в любой версии XPath / XSLT. Этот ответ бесполезен и должен быть удален.
Ваш ответ правильный для получения расширения. Для получения имени файла и расширения вы можете проверить и «подстроку после» «/». Это приведет к получению имени файла. При этом вы также можете легко получить расширение с помощью: substring-after (filenameWithExtension, '.').