2

我正在使用 MarkupBuilder 从 taglib 中呈现一些 HTML,如下所示(为了清楚起见,将其删除):

def formContainer = new MarkupBuilder(out)
formConainer.form() {
   input() { }
   input() { }
}

现在假设在 form() 内部的某个地方,我想提取用户指定的一些元素,因此在文件系统上的文件中,我有类似这样的内容(再次简化)...

select() {
  option()
  option()
}

我的问题是,如果我将 select in 作为字符串读取,是否有办法让 taglib 将其解析为 groovy 并使其成为 MarkupBuilder 实例的一部分?

def formContainer = new MarkupBuilder(out)
formConainer.form() {
   input() { }
   input() { }

   // I want the select to render here
}
4

1 回答 1

1

一种方法是:

String externalMarkup = '''
select() {
  option()
  option()
}
'''
def out = new StringWriter()

def formContainer = new groovy.xml.MarkupBuilder( out )
formContainer.form() {
   input()
   input()

   // Wrap the string in { -> ... } to make it a closure, and evaluate it
   def extern = new GroovyShell().evaluate( "{ it-> ${externalMarkup} }" )
   // Set the delegate of this closure to the MarkupWriter
   extern.delegate = formContainer
   // Then execute the closure
   extern()
}
println out.toString()

然而,这对我来说感觉很脆弱......

更好的方法可能是使用GroovyTemplateEngine将您的值注入格式化的完整标记位

于 2011-10-12T08:59:15.460 回答