Back-End

6 nov, 2012

Como gerar uma transformação XSLT usando o GroovyStreamingMarkupBuilder

Publicidade

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/