Introdução
Neste tutorial, vamos explorar como utilizar XSLT (Extensible Stylesheet Language Transformations) para transformar dados XML de forma eficiente utilizando os frameworks Saxon e Xalan. A transformação de dados é uma habilidade crítica em muitos projetos de integração, e o XSLT é uma das ferramentas mais potentes para este tipo de tarefa. Neste guia, focaremos em um projeto que implementa essas transformações de maneira prática, utilizando Java e Spring Boot. Vamos abordar desde a configuração do ambiente até a execução de testes unitários, proporcionando uma compreensão completa do ciclo de desenvolvimento.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o JDK (Java Development Kit) e o Maven instalados em sua máquina. Utilizaremos o Maven para gerenciamento de dependências em nosso projeto. Caso não tenha as ferramentas instaladas, você pode seguir as instruções nos sites oficiais.
commands# Verificar versões instaladas
java -version
mvn -versionCriação do Projeto Spring Boot
Utilize o Spring Initializr para gerar um novo projeto Spring Boot com as dependências necessárias. Configure o projeto com as opções: Project: Maven, Language: Java, Spring Boot: última versão estável, Packaging: Jar, e Java: 11 ou superior. Adicione as dependências ‘Spring Web’ e ‘Spring Boot Starter Test’. Baixe e descompacte o projeto em seu ambiente.
pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>xslt-integration</artifactId> <version>0.0.1-SNAPSHOT</version> <name>xslt-integration</name> <description>Projeto de Integração com XSLT</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>12.0</version> </dependency> <dependency> <groupId>xalan</groupId> <artifactId>xalan</artifactId> <version>2.7.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Adicionando Arquivo XML e XSLT
Crie um diretório `src/main/resources` e adicione dois arquivos: `data.xml` contendo os dados que você deseja transformar e `transform.xsl` que contém a lógica XSLT para transformação dos dados XML.
data.xml<?xml version="1.0" encoding="UTF-8"?> <produtos> <produto> <id>1</id> <nome>Produto A</nome> <preco>10.0</preco> </produto> <produto> <id>2</id> <nome>Produto B</nome> <preco>20.0</preco> </produto> </produtos>
transform.xsl<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Lista de Produtos</h2> <table border="1"> <tr> <th>ID</th> <th>Nome</th> <th>Preço</th> </tr> <xsl:for-each select="produtos/produto"> <tr> <td><xsl:value-of select="id" /></td> <td><xsl:value-of select="nome" /></td> <td><xsl:value-of select="preco" /></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Implementação do Serviço de Transformação
Crie uma classe de serviço `XSLTService` que será responsável por realizar a transformação utilizando os frameworks Saxon e Xalan de acordo com a lógica definida no arquivo XSLT.
XSLTService.javapackage com.example.xsltintegration.service; import org.springframework.stereotype.Service; import javax.xml.transform.*; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import java.io.StringWriter; @Service public class XSLTService { public String transformXML(String xmlInput, String xsltFilePath) throws TransformerException { Source xmlSource = new StreamSource(new java.io.StringReader(xmlInput)); Source xsltSource = new StreamSource(xsltFilePath); StringWriter stringWriter = new StringWriter(); Result result = new StreamResult(stringWriter); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(xsltSource); transformer.transform(xmlSource, result); return stringWriter.toString(); } }
Criação do Controlador para Expor a API
Implemente um controlador `XSLTController` que expõe um endpoint para realizar a transformação de XML passando um arquivo XML de entrada e o estilo XSLT.
XSLTController.javapackage com.example.xsltintegration.controller; import com.example.xsltintegration.service.XSLTService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/transform") public class XSLTController { @Autowired private XSLTService xsltService; @PostMapping public String transformXML(@RequestBody String xmlInput) { try { String xsltPath = "classpath:transform.xsl"; return xsltService.transformXML(xmlInput, xsltPath); } catch (Exception e) { return "Erro na transformação: " + e.getMessage(); } } }
Implementação de Testes Unitários
Vamos criar testes unitários para o serviço de transformação para garantir que a lógica de transformação funcione corretamente.
XSLTServiceTest.javapackage com.example.xsltintegration.service; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.MockitoAnnotations; import javax.xml.transform.TransformerException; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; public class XSLTServiceTest { @InjectMocks private XSLTService xsltService; public XSLTServiceTest() { MockitoAnnotations.openMocks(this); } @Test public void testTransformXML() { String xmlInput = "<produtos><produto><id>1</id><nome>Produto A</nome><preco>10.0</preco></produto></produtos>"; try { String result = xsltService.transformXML(xmlInput, "src/main/resources/transform.xsl"); assertNotNull(result); } catch (TransformerException e) { fail("Exceção na transformação: " + e.getMessage()); } } }
Executando a Aplicação e Testes
Use o Maven para compilar e executar a aplicação. Em seguida, utilize ferramentas como Postman ou cURL para testar o endpoint de transformação XML que você implementou.
commands# Compilar e executar a aplicação
mvn spring-boot:run
# Executar os testes unitários
mvn testcurl_examples# Testar a transformação XML
curl -X POST -H 'Content-Type: application/xml' -d '<produtos><produto><id>1</id><nome>Produto A</nome><preco>10.0</preco></produto></produtos>' http://localhost:8080/api/transform
Conclusão
Neste tutorial, abordamos como utilizar XSLT em conjunto com os frameworks Saxon e Xalan para realizar transformações de dados em projetos de integração utilizando Java e Spring Boot. Vimos desde a configuração do ambiente, a criação de arquivos XML e XSLT, até a implementação do serviço e a criação de testes unitários. Com este conhecimento, você está agora apto a aplicar transformações XML em seus próprios projetos, facilitando a integração e manipulação de dados.