Como Fazer Reverse Find da Última Ocorrência de um Caractere em uma String Usando XSLT

Encontrar caracteres específicos em strings pode ser uma tarefa comum na programação, especialmente ao lidar com URLs ou caminhos de arquivos. Em XSLT, embora existam funções para encontrar a primeira ocorrência de um caractere, pode ser necessário recuperar a última ocorrência de um caractere, particularmente ao extrair nomes de arquivos e extensões. Este post no blog apresenta uma solução para um problema típico: como fazer reverse find de um caractere em uma string e extrair informações significativas.

O Desafio: Extraindo Extensões de Arquivos

Considere este exemplo:

<mediaurl>http://www.blah.com/path/to/file/media.jpg</mediaurl>

Usando funções básicas de XSLT como substring-before() e substring-after(), podemos localizar facilmente a primeira ocorrência do ponto (.) na URL do arquivo. No entanto, para recuperar o nome do arquivo e sua extensão, precisamos identificar o último ponto dentro da string—uma operação que não é simples com funções padrão.

Por Que Precisamos da Última Ocorrência?

O objetivo é separar o nome do arquivo de sua extensão. Por exemplo, da URL acima, queremos extrair:

  • Nome do Arquivo: media
  • Extensão do Arquivo: jpg

Para alcançar isso, precisamos de um método para localizar o último . na string de forma eficaz.

A Solução: Um Modelo Personalizado de XSLT

Aqui está um método simples e eficaz para encontrar a última ocorrência de um caractere em uma string usando XSLT 1.0. A solução envolve a criação de um modelo recursivo que processa a string e recupera as partes necessárias.

Implementação do Código XSLT

Aqui está um exemplo de modelo que alcança esse objetivo:

<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>

Explicação do Código

  • Declaração do Modelo: O modelo getExtension é projetado para extrair a extensão do arquivo de um nome completo de arquivo.

  • Parâmetro: Ele aceita um parâmetro $filename, que contém a string a ser processada.

  • Lógica Condicional:

    • Se o nome do arquivo contém um ponto, ele chama a si mesmo recursivamente, passando a substring após o primeiro ponto.
    • Isso continua até que chegue à última substring (a extensão real), que é impressa como saída.
  • Modelo de Correspondência da Raiz: O modelo principal corresponde à raiz e inicia a chamada para getExtension, fornecendo a URL da qual estamos extraindo a extensão.

Como Usá-lo

Para usar o XSLT acima em seu projeto:

  1. Insira este código em sua folha de estilo XSLT.
  2. Modifique a URL ou caminho na instrução select dentro do modelo raiz conforme necessário.
  3. Processe seus dados XML para recuperar a extensão do arquivo de forma tranquila!

Considerações Finais

Encontrar a última ocorrência de um caractere em uma string dentro das limitações do XSLT pode ser realizado com um pouco de criatividade. Ao utilizar modelos recursivos, você pode dissecar strings complexas e extrair informações valiosas como nomes de arquivos e extensões, aprimorando suas tarefas de manipulação de dados.

Sinta-se à vontade para retornar a este guia sempre que enfrentar desafios semelhantes de processamento de strings em XSLT!