热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中使用params的高效XSLT管道

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

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

Efficient XSLT pipeline in Java (or redirecting Results to Sources)

不幸的是,虽然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



MyStylesheet2.xslt



in.xml




这给了我以下输出:


foo is :

你可以看到foo:world / @ attr是空的,foo:world的文本内容说“foo is:”.预期的行为是它们应该已经填充了传递给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()上启动变换链即可


推荐阅读
author-avatar
书友69391618
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有