情况:我有以下样式表/模板
class ServerThreadRunnable implements Runnable {
private Socket conn;
ServerThread(Socket s) {
conn = s;
}
public void run() {
//Here the implementation goes as per your requirement
}
}
我还有一个存储键值对的属性文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" x
mlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Hello</title>
</head>
<body >
<div align="center">
<table border="1">
<tr>
<td >
<h1 >
<span>@HEADER@</span>
</h1>
<div>
<p>
@DETAIL@
</p>
</div>
</tr>
</table>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
问题:我正在尝试编写一个java程序来将DETAIL=This is format detail
HEADER=This is format header
转换为xsl
文件,同时这样做我想替换指定的键值html
(包含在@中),.xsl
中提到了他们的值。我的约束是我无法修改.properties file
文件,我曾尝试.xsl
但它没有工作谁能帮助我实现这个目标?
答案 0 :(得分:0)
我想你想构建一个参数XSL模板,参数在属性文件中。
XSL和属性文件是否非常大?
如果文件很小,您可以逐行读取XSL文件并使用字符串替换:
// preparing parsed template
File fout = new File("parsed.xsl");
FileOutputStream fos = new FileOutputStream(fout);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
// preparing map for properties
Map<String, String> map = new HashMap<>();
for (final String name: properties.stringPropertyNames())
map.put(name, properties.getProperty(name));
// read file and replace key with value
try (BufferedReader br = new BufferedReader(new FileReader(xslTemplate))) {
String line;
while ((line = br.readLine()) != null) {
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
String temp = line.replace("@"+pair.getKey()+"@",pair.getValue());
bw.write(temp);
bw.newline();
}
}
如果文件很大,您可以在另一种方法中使用此函数,该方法仅用于生成已解析的模板,然后在正常执行中使用新文件。
如果你在Main.class中调用它,你可以添加一个参数,例如“-c”并在编译模式下启动程序;
如果您在Web应用程序中使用它,可以使用@Startup注释在单例中添加方法调用,并在用户更改XSL或属性文件时调用
我没有尝试过代码,也许有一些语法错误。 我希望解析中使用的逻辑很简单。
答案 1 :(得分:0)
根据您的语言环境读取属性文件的代码。
<xsl:stylesheet version="2.0" xmlns:f="Functions"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Code for reading proprty file -->
<xsl:function name="f:getProperty" as="xs:string?">
<xsl:param name="key" as="xs:string" />
<xsl:variable name="lines" as="xs:string*"
select="
for $x in
for $i in tokenize($properties, '\n')[matches(., '^[^!#]')] return
tokenize($i, '=')
return translate(normalize-space($x), '\', '')" />
<xsl:sequence select="$lines[index-of($lines, $key)+1]" />
</xsl:function>
从属性文件中打印消息的代码。
<xsl:value-of select="f:getProperty('abc.xyz')" />