Java中使用params的高效XSLT管道

这个问题的最佳答案描述了一种在Java中实现高效XSLT管道的技术:

Java中的高效XSLT管道(或将结果重定向到源)

不幸的是,虽然Transformer似乎公开了一个用于设置XSLT参数的API,但这似乎没有任何效果。 例如,我有以下代码:

Transformer.java

import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.Templates; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.Transformer; import java.io.File; public class MyTransformer { public static void main(String[] args) throws javax.xml.transform.TransformerConfigurationException, javax.xml.transform.TransformerException{ SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); // These templates objects could be reused and obtained from elsewhere. Templates templates1 = stf.newTemplates(new StreamSource( new File("MyStylesheet1.xslt"))); Templates templates2 = stf.newTemplates(new StreamSource(new File("MyStylesheet2.xslt"))); TransformerHandler th1 = stf.newTransformerHandler(templates1); TransformerHandler th2 = stf.newTransformerHandler(templates2); th1.setResult(new SAXResult(th2)); th2.setResult(new StreamResult(System.out)); Transformer t = stf.newTransformer(); //SETTING PARAMETERS HERE t.setParameter("foo","this is from param 1"); t.setParameter("bar","this is from param 2"); t.transform(new StreamSource(new File("in.xml")), new SAXResult(th1)); // th1 feeds th2, which in turn feeds System.out. } } 

MyStylesheet1.xslt

             foo is :      

MyStylesheet2.xslt

                   

in.xml

    

这给了我以下输出:

  foo is :   

你可以看到foo:world / @ attr是空的,foo:world的文本内容说“foo是:”。 预期的行为是它们应该已经填充了传递给setParameter方法的参数。

有没有办法使用这种技术设置XSL转换参数。 如果没有,有人可以推荐一种替代技术来有效地在Java中转换样式表,这样也可以设置XSLT参数吗?

问题是每个TransformerHandler都有一个与之关联的独立Transformer。 您的第二个模板存在问题,但由于这是一个示例,我猜这无关紧要。 你要:

 //SETTING PARAMETERS HERE th1.getTransformer().setParameter("foo","this is from param 1"); th2.getTransformer().setParameter("bar","this is from param 2"); 

请注意,您也不需要创建第3个变换器,只需在th1.getTransformer()上启动变换链即可

与最后一个笔记有关。 在th1.getTransformer()上调用transform(),结果再次指向th1是不正确的。 它将被处理两次。 使用新的Transformer()就像在初始post中显示的那样是正确的方法。

 t.transform(new StreamSource(new File("in.xml")), new SAXResult(th1));