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/







