XSLT para aplicar em Script Functoids de BizTalk [pt-BR]

Para quem trabalha com manipulação de ficheiros XML, certamente já terá tido necessidade de procurar a linguagem XSLT para efectar transformações na apresentação do XML. De uma forma análoga, o XSLT aplica-se ao XML como o CSS se aplica ao HTML.

Apesar de a manipulação de ficheiros xml ser absolutamente necessária, o xslt pode barrar no raciocinio de muitos programadores por inverter um pouco o paradigma de pensamento a que estão habituados. Uma forma simples de perceber o problema é tentar ver de que forma um programador pode implementar um método para percorrer nodos de XML de forma a somar valores de um dado elemento e posteriormente agrupá-los por uma determinanda clausula. Para aqueles que estão familiarizados com o SQL um query de resposta a este problemé bastatnte simples com algo deste genero:

                Select sum(TABLE_VALUE1)

                From TABLE

                Group by datepart(month,getdate());

Agora pensemos em XML, que nada mais nada menos é do que texto corrido embotido num conjunto de tags. Certamente já pensaram em index of e substring pois para um programador, trabalhar texto é sinónimo destes métodos.

A novidade que vos trago é que substituindo o indexof pela linguagem Xpath e o substring por XSLT conseguem obter resultados muito mais eficazes e eficientes.

O XSLT é então uma linguagem de transformação de ficheiros XML e cuja sigla deriva do XSL (Extensible Stylesheet Language) e o T significa Transformation.

Esta linguagem contém um conjunto de tags que correspondem a nodos, tal como o XML, para efectuar os procedimentos que desejamos. A primeira delas é o elemento:

<xsl:template>

Este primeiro elemento é o que define o conjunto de regras a aplicar na transformação, digamos por analogia que é a definição de uma classe em C#, JAVA ou qualquer outra linguagem de programação. Serve assim para criar templates que depois serão usados em XML. Contém um atributo match que é bastante importante e serve para indicar se este template se aplica a todo o documento xml ou só uma parte. Esta definição do que é abrangido pelo template é realizada em Xpath. Se o definirmos como match=”/ListaPessoas/Pessa”, só se aplicará a nodos do tipo pessoa.

 

 

<xsl:value-of>

Este elemento serve para extrair um determinado valor do documento XML e será certamente aquele que será mais utilizado no nosso Template. Tem um atributo muito importante através do qual definimos que valor é extraido e de que nodo, o select. Se o defirmos por exemplo como <xsl:value-of select=”/ListaPesoas/Pessoa[0]/Nome”/> o valor a extrair será o nome da primeira pessoa do nosso XML.

<xsl:for-each>

O element for-each é o melhor amigo do value-of, pois permite percorrer um determinado conjunto de nodos do mesmo tipo, desta forma e combinando com o value-of, podemos extrair todos os valores de um determinando nodo. Contém igualmente  o atributo select, no qual definimos qual o tipo de nodos a percorrer e igualmente definidos em Xpath. Por exemplo se defirnmos <xsl:for-each select=’/ListaPessoas/Pessoa/Nome’ iremos percorrer todos os nomes das pessoas do documento xml. Ora de dentro deste elemento colocarmos o value-of, podemos extrair todos o nome de todas as pessoas.

                <xsl:sort> , dentro do for-each podemos ainda incluir o element sort que irá definir o elemento ou atributo pelo qual vamos ordenar a disposição do for-each. Contém igualmente o atributo select já explicado.

<xsl:if>

Este elemento permite facilmente incluir uma condição de execução dentro do XSLT. È semelhante a um qualquer if..then..else de uma qualquer linguagem de programação. Contém um atributo fundamental que é o test. Se por exemplo definirmos <xsl:if test=”/ListaPessoas/Pessoa/Idade &gt; 20“> estamos a testar se a idade da pessoa em processamento é superior a 20. De lembrar que como sendo XSLT um ficheiro de hyper texto à determinandos caracteres que não são lidos pelos browsers, pelo que temos de utilizar a mesma sintaxe de HTML ou seja para definir o sinal de > temos de utilizar &gt; (greater than).

<xsl:choose>

Este elemento corresponde ao switch do java ou select do vb, e é uma expansão da estrutura de decisão if..then..else, ou seja permite testar mais do que uma condição facilmente. Dentro deste elemento podemos utilizar o elemento <xsl:when> que permite criar condições com o seu atributo teste, e temos ainda o <xsl:otherwise> que permite criar um else no final do choose, ou seja caso nenhuma das condições se verifique é esta a exeutada.

 

 

Um exemplo de aplicação é :

<xsl:choose>

                <xsl:when teste=”/ListaPessoas/Pessoa/Idade &gt; 50“>

                                <h1>Idade maior que 50</h1>

                                <xsl:value-of select=”/ListaPessoas/Pessoa/Idade”/>

</xsl:when>

<xsl:when teste=”/ListaPessoas/Pessoa/Idade &gt; 25“>

                                <h1>Idade maior que 25 e menor que 50</h1>

<xsl:value-of select=”/ListaPessoas/Pessoa/Idade”/>

</xsl:when>

<xsl:otherwise>

<h1>Idade menor que 25!</h1>

<xsl:value-of select=”/ListaPessoas/Pessoa/Idade”/>   

</xsl:otherwise>

</xsl:choose>

Neste momento temos s elementos principais do XSLT explicadas e podemos lançarnos ao trabalho e desenvolver os nossos algoritmos. Em posts posteriores vou resolver alguns exercicios atraves de XSLT por isso estejam atentos.

 

Obrigado,

Rui Machado

 

 

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s