Dev (Back & Front)ARTIGO

Como gerar uma transformação XSLT usando o GroovyStreamingMarkupBuilder

Groovy e XSLT são duas ótimas opções para trabalhar com XML. Embora ambos tenham seus usos, eu estava curioso para combiná-los para gerar uma transformação XSLT com um script Groovy. Acontece que fazer isso é bem simples, com pequenas ressalvas.

Groovy e XSLT são duas ótimas opções para trabalhar com XML. Embora ambos tenham seus usos, eu estava curioso para combiná-los para gerar uma transformação XSLT com um script Groovy. Acontece que fazer isso é bem simples, com pequenas ressalvas.

Namespaces

Os comandos XSLT como template e value-of são definidos no namespace “http://www.w3.org/1999/XSL/Transform” (comumente apelidado de xsl). Portanto, gerar XML com comandos XSLT requer o uso de um namespace.

Felizmente, o StreamingMarkupBuilder do Groovy tem suporte para namespaces através de um objeto de marcação especial chamado mkp, o qual contém a função declareNamespace():

def xmlWithNamespace = new StreamingMarkupBuilder().bind {     mkp.declareNamespace(abc: "some namespace") }

Uma vez declarada, a criação de um node usando o namespace é simplesmente uma questão de usar a notação “.”:

namespace.nodeName {     namespace.anotherNodeName {         ...     } }

Casing Style não-amigável

Como a maioria dos outros padrões W3C, o XSLT usa o estilo “minúsculas-com-hífens” para suas palavras-chave: value-of, apply-templates, e assim por diante. Isso cria uma ligeira complicação para o Groovy, porque as palavras com hífens não são símbolos válidos (ou seja, xsl.value-of{} não funcionará). Em vez disso, você tem que colocar esses termos entre aspas: xsl.”value-of”{}.

Resultado final

Então, aqui vai um script Groovy para gerar uma simples transformação XSLT:

def xmlWithNamespace = new StreamingMarkupBuilder().bind {     mkp.declareNamespace(mynamespace: "http://www.w3.org/1999/XSL/Transform") }     xsl.stylesheet(version:"2.0") {         xsl.template(match:"/") {             html {                 head {                     title("list of items")                 }             }             body {                 h1("items") {                    ul {                        xsl."apply-templates"(select:"items/item")                    }                 }             }         }         xsl.template(match:"item") {             li {                 xsl."value-of"(select:"name")             }         }     } }

E aqui está o XSLT que o script acima gera:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">     <xsl:template match="/">         <html>             <head>                 <title>list of items</title>             </head>         </html>         <body>             <h1>                 <ul>                     <xsl:apply-templates select="items/item"/>                 </ul>             </h1>         </body>     </xsl:template>     <xsl:template match="item">         <li>             <xsl:value-of select="name"/>         </li>     </xsl:template> </xsl:stylesheet>

 

***

Texto original disponível em http://tatiyants.com/how-to-generate-xslt-using-groovy-streamingmarkupbuilder/

Gosta de escrever coisas engraças sobre tecnologia. É criador do JS.js e do movimento MoreSQL, além de inventor do Guilt Driven Development.

Ver perfil