Pergunta
Preciso encontrar a última ocorrência de um caractere dentro de um elemento.
Por exemplo:
<mediaurl>http://www.blah.com/path/to/file/media.jpg</mediaurl>
Se eu tentar localizá-lo usando substring-before(mediaurl, '.')
e substring-after(mediaurl, '.')
então, é claro, corresponderá ao primeiro ponto.
Como eu obteria a extensão do arquivo?Essencialmente, preciso obter o nome do arquivo e a extensão de um caminho como este, mas estou bastante perplexo sobre como fazer isso usando XSLT.
Solução
A seguir está um exemplo de modelo que produziria a saída necessária no 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>
Outras dicas
Se você estiver usando XSLT 2.0, é fácil:
<xsl:variable name="extension" select="tokenize($filename, '\.')[last()]"/>
Se não estiver, é um pouco mais difícil.Há um bom exemplo do Livro de receitas O'Reilly XSLT.Procure por "Tokenização de uma String".
Acredito que também exista uma função EXSLT, se você tiver disponível.
Que tal tokenizar com "/" e pegar o último elemento do array?
Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
Foi um violinista XSLT algum tempo atrás ...perdi o contato agora.Mas HTH
Para referência, esse problema é geralmente chamado de "substring-after-last" em XSLT.