使用来自外部目录的文件的Java StringTemplate

使用来自外部目录的文件的Java StringTemplate,java,antlr,antlr4,stringtemplate,stringtemplate-4,Java,Antlr,Antlr4,Stringtemplate,Stringtemplate 4,我的目录结构如下: Templates/ ├── Foo/ │ ├── Foo.st ├── Signature.st 下面是Foo.st的样子: <?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> </head> <body> <div id

我的目录结构如下:

Templates/
├── Foo/
│   ├── Foo.st
├── Signature.st
下面是
Foo.st
的样子:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
    <div id="body">
        <p> Some Text </p>
    </div>
    $Signature()$
</body>
</html>
但结果是:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
    <div id="body">
        <p> Some Text </p>
    </div>
</body>
</html>

一些文本

如何使
Foo
模板能够正确引用签名模板

如果我将
Signature.st
放在
Foo
目录中,那么上面的代码工作得很好,但我不能这样做,因为我将有许多模板引用
签名
模板。

尝试:

...
$/Signature()$
...

模板调用相对于调用模板进行解析。使用前缀
/
启动模板调用将使模板调用成为绝对的-这正是您所期望的。

我找到了一种非常简单的方法。我现在有以下目录结构:

Templates/
├── Foo/
│   ├── Foo.st
├── Main.st
├── Signature.st
这是我的
Main.st

$ templates : { template |
$(template)()$
}$

$Signature()$
下面是我的java代码:

STRawGroupDir dir = new STRawGroupDir("Templates", '$', '$');
ST st = dir.getInstanceOf("Main");
st.add("templates", Arrays.asList("/Foo/Foo.st"));
st.render();
现在我可以通过任何数量的模板,这是完美的作品

STRawGroupDir dir = new STRawGroupDir("Templates", '$', '$');
ST st = dir.getInstanceOf("Main");
st.add("templates", Arrays.asList("/Foo/Foo.st"));
st.render();