当前位置: 首页 > 面试题库 >

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

籍兴文
2023-03-14
问题内容

我有一系列相互配合的XSL 2.0样式表,即样式表A的输出提要B的提要C的提要。

最有效的方法是什么?改写的问题是:如何将一个转换的输出有效地路由到另一个转换。

这是我的第一次尝试:

@Override
public void transform(Source data, Result out) throws TransformerException{
    for(Transformer autobot : autobots){
        if(autobots.indexOf(autobot) != (autobots.size()-1)){
            log.debug("Transforming prelim stylesheet...");
            data = transform(autobot,data);
        }else{
            log.debug("Transforming final stylesheet...");
            autobot.transform(data, out);
        }
    }
}

private Source transform(Transformer autobot, Source data) throws TransformerException{
    DOMResult result = new DOMResult();
    autobot.transform(data, result);
    Node node = result.getNode();
    return new DOMSource(node);
}

如您所见,我正在使用DOM来进行转换之间的转换,尽管它很方便,但它并不是最佳的性能。

有没有简单的方法可以说,将SAXResult路由到SAXSource?StAX解决方案将是另一种选择。

我知道像XProc这样的项目,如果您还没有看过的话,它非常酷,但是我不想投资整个框架。


问题答案:

我发现了:#3。链接转换,显示了两种使用 TransformerFactory
链接转换的
方法,一次转换的结果将馈入下一个转换,然后最终输出到系统。这避免了在转换之间对字符串,文件等进行中间序列化的需要。

当同一XML文档需要进行多次连续转换时,请确保避免不必要的解析操作。我经常碰到将一个字符串转换为另一个字符串,然后将该字符串转换为另一个字符串的代码。这不仅速度很慢,而且还会消耗大量内存,尤其是在不允许对中间字符串进行垃圾回收的情况下。

大多数转换基于一系列SAX事件。SAX解析器通常会将一个InputStream或另一个InputSource解析为SAX事件,然后可以将其提供给Transformer。除了将Transformer输出到File,String或另一个此类Result之外,还可以使用SAXResult。SAXResult接受ContentHandler,它可以将这些SAX事件直接传递到另一个Transformer等。

这是一种方法,我通常喜欢这种方法,因为它为各种输入和输出源提供了更大的灵活性。它还使动态创建具有可变数量的转换的转换链变得相当容易。

SAXTransformerFactory stf =

(SAXTransformerFactory)TransformerFactory.newInstance();

// These templates objects could be reused and obtained from elsewhere.
Templates templates1 = stf.newTemplates(new StreamSource(
  getClass().getResourceAsStream("MyStylesheet1.xslt")));
Templates templates2 = stf.newTemplates(new StreamSource(
  getClass().getResourceAsStream("MyStylesheet1.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();
t.transform(new StreamSource(System.in), new SAXResult(th1));

// th1 feeds th2, which in turn feeds System.out.


 类似资料:
  • 问题内容: 我有一系列相互配合的XSL 2.0样式表,即样式表A的输出提要B的提要C的提要。 最有效的方法是什么?改写的问题是:如何将一个转换的输出有效地路由到另一个转换。 这是我的第一次尝试: 如您所见,我正在使用DOM来进行转换之间的转换,尽管它很方便,但它并不是最佳的性能。 有没有简单的方法可以说,将SAXResult路由到SAXSource?StAX解决方案将是另一种选择。 我知道像XPr

  • 问题内容: 这个问题的最高答案描述了一种在Java中实现有效的XSLT管道的技术: [Java中有效的XSLT管道(或将结果重定向到源)http://codingdict.com/questions/155853 不幸的是,尽管Transformer似乎公开了用于设置XSLT参数的API,但这似乎没有任何效果。例如,我有以下代码: 变形金刚 MyStylesheet1.xslt MyStylesh

  • 问题内容: 我创建了一个在命令行上打印结果的程序。(它是服务器,并在命令行上打印日志。) 现在,我想对GUI看到相同的结果。 如何将命令行结果重定向到GUI? 请提出一个技巧,以轻松地将控制台应用程序转换为简单的GUI。 请注意,它应在Linux和Windows上运行。 问题答案: 您可以创建一个脚本包装程序,该程序包装程序将您的命令行程序作为子进程运行,然后将输出添加到诸如文本小部件之类的东西中

  • 问题内容: 也许这是一个愚蠢的问题,但是我试图将“ java -version”命令的出口重定向到文件或变量,但是它不起作用。 服务器= Linux CentOS 6 我在Shell脚本中的代码 另外我正在尝试将其分配给变量: 即使从命令行运行那些命令,它仍然无法正常工作。 当我说它不起作用时,我的意思是该命令的退出正在屏幕上显示,而不是将其重定向到文件或任何地方 … 问题答案: 写入stderr

  • 我正在使用聚合管道。 这将产生以下结果: {"_id": ObjectId("512bc95fe835e68f199c8686"),"作者":"戴夫","分数": 80,"视图": 100} {"_id": ObjectId("512bc962e835e68f199c8687"),"作者":"戴夫","分数": 85,"意见": 521} 我想将这个管道结果(在本例中是一个数组)简化为一个对象。我

  • 假设我有理由要求通过多个值类型快速查找类实例,为了便于解释,我将以游戏服务器为例。 假设服务器使用静态标识号处理用户。这个数字用于与特定玩家交流和互动(即:私聊、交易请求、战斗、公会邀请等)。 这需要经常使用玩家的识别号来查找玩家,根据我目前的经验,最好的方法是:(如果我错了,请纠正我。) 然而,在处理网络时,很多时候我还需要将播放器与网络会话关联,或者一些人可能更熟悉的“套接字”。看起来是这样的