在JavaFX TextArea中显示来自XSLT转换的XML

时间:2017-05-30 13:17:48

标签: java xml xslt javafx

我试图创建一个应用程序,在其中我将XML格式的文本写入TextArea并应用缩进转换(使用XSLT),最后在TextArea中显示它。

但我收到的只是图像中的XML元素的内容:

enter image description here

我在Java中的代码如下:

public class Vista extends Application{

Label LIn;
TextArea TIn;

Label LOut;
TextArea TOut;

Button BTransform;

String xslt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
            "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"> " + 
            "<xsl:output method=\"xml\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/> " + 
            "<xsl:copy-of select=\".\"/> " + 
            "</xsl:stylesheet>";

@Override
public void start(Stage StageInicial) throws Exception {

    StageInicial.setTitle("XML Indent");

    LIn = new Label("XML Entrada:");
    TIn = new TextArea();

    LOut = new Label("XML Salida:");
    TOut = new TextArea();

    BTransform = new Button("Indent XML!");

    BTransform.setOnAction(action -> {
        try {
            transformation();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    });

    GridPane gridPane = new GridPane();

    gridPane.add(LIn, 0, 0);
    gridPane.add(TIn, 0, 1);

    gridPane.add(LOut, 1, 0);
    gridPane.add(TOut, 1, 1);

    gridPane.add(BTransform, 0, 3, 2, 2);

    gridPane.setHgap(10);
    gridPane.setVgap(10);

    Scene scene = new Scene(gridPane, 1048, 720);
    StageInicial.setScene(scene);
    StageInicial.show();       

}

public void transformation() throws TransformerException{

    StringReader reader = new StringReader(TIn.getText());
    StringReader readerXSLT = new StringReader(xslt);
    StringWriter writer = new StringWriter();

    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(new javax.xml.transform.stream.StreamSource(readerXSLT));

    transformer.transform(
            new javax.xml.transform.stream.StreamSource(reader), 
            new javax.xml.transform.stream.StreamResult(writer));

    TOut.setText(writer.toString());

}
}

我做错了吗?我该怎么办呢?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果你想进行身份转换,那么(使用JAXP)要么创建一个新的Transformer而不提供样式表(https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTransformer--),要么确保你提供的XSLT实际上是在执行副本,你的代码是顶级的级别"<xsl:copy-of select=\".\"/> "甚至不应该编译我认为,你宁愿想<xsl:template match="/"><xsl:copy-of select="."/></xsl:template>