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 {
}
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: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/