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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top