Java 在TextArea中将xsl:message打印为字符串

Java 在TextArea中将xsl:message打印为字符串,java,xslt,Java,Xslt,我正试图在JTextArea中打印xsl:message。我知道我必须使用一个消息发射器 以下是我的Java代码: public static void xslTransform(File xmlFile,File xslFile, JTextArea output){ StreamSource source = new StreamSource(xmlFile); StringWriter writer = new StringWriter(); StreamResult result = n

我正试图在JTextArea中打印xsl:message。我知道我必须使用一个消息发射器 以下是我的Java代码:

public static void xslTransform(File xmlFile,File xslFile, JTextArea output){
StreamSource source = new StreamSource(xmlFile);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory transFact = new TransformerFactory.newInstance();
transFact.setAttribute(FeatureKeys.MESSAGE_EMITTER_CLASS, "net.sf.saxon.serialize.MessageEmitter");
Transformer transformer = transFact.newTransformer(new StreamSource(xslFile));
transformer.transform(source, result);
有人能帮我从电话里拿一根线吗

这是我当前的代码:

public static void xslTransform(File xmlFile)throws IOException, TransformerException{
File xslFile = ...;
StreamSource xmlSource = new StreamSource(xmlFile);
StreamSource xslSource = new StreamSource(xslFile);
StreamResult result = new StreamResult (new StringWriter()); //maybe here is the problem?
TransformerFactory transformerFact = TransformerFactory.newInstance();
transformerFact.setAttribute(FeatureKeys.MESSAGE_EMITTER_CLASS, "MyMessageEmitter");
Transformer transformer = transformerFact.newTransformer(xslSource);
transformer.transform(xmlSource,result);
}
MyMessageEmitter类:

public class MyMessageEmitter extends net.sf.saxon.serialize.MessageEmitter{
String message;
private StringWriter stwriter = new StringWriter();
public void MyMessageEmitter() throws XPathException{
setWriter(stwriter);
}
@Override
public void close() throws XPathException{
super.close();
message=stwriter.toString();
System.out.println(message);
stwriter = new StringWriter();
}
}
为什么消息现在总是空的


KaFu

您指定作为消息发射器的类是标准的Saxon消息发射器,但您要做的是实现自己的消息发射器。大概是这样的:

public static class MyMessageEmitter extends net.sf.saxon.serialize.MessageEmitter {

   StringWriter writer = new StringWriter();

   public MyMessageEmitter() {
     setWriter(writer);
   }

   public void close() {
     super.close();
     String message = writer.toString();
     // now do what you want with the message
     writer = new StringWriter(); // ready for the next message
   }
}
然后

transFact.setAttribute(FeatureKeys.MESSAGE_EMITTER_CLASS, "MyMessageEmitter");

实际上,使用Saxon的s9api接口比使用JAXP要容易一些,如果你是一个更有经验的Java程序员,我会告诉你这个方向,但是,由于您对游戏还不熟悉,采取小步骤可能更容易。

这与什么不同?在我的上一个问题中,我不知道如何实现消息发射器。现在我不知道如何从实现的发射器获取字符串。他们还告诉我应该为我的新问题创建一条新消息在他们告诉我应该创建一个新问题之前,我编辑了最后一个问题。这很公平。我已经回滚了对另一个问题的编辑,因此它与答案一致。谢谢你这么做=看起来真的很好,但是我的作者总是空的,我用我当前的代码编辑问题。希望你能告诉我出了什么问题……我建议你试着编写一个repro:这是一个独立的程序,以其他人可以运行的形式演示问题。如果代码不是以可运行的形式提供的,那么调试其他人的代码是非常困难的。我犯了一个错误,它编写xsl的输出,而不是消息!!我还需要一次帮助。。。我的xsl更改了xml,我的输出是一个新的xml,但我的xslt中也有标记,这就是我想要在文本区域中打印的内容。它是如何工作的?谢谢你迄今为止的帮助。请提出一个新问题,告诉我们你到底在做什么,以及它是如何失败的。