如何使用java读取.xsl文件中的.properties文件?

时间:2016-06-04 07:28:27

标签: java xml xslt xslt-2.0 properties-file

情况:我有以下样式表/模板

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但它没有工作谁能帮助我实现这个目标?

2 个答案:

答案 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')" />