【发布时间】:2018-09-20 11:50:01
【问题描述】:
我有一个使用 XSL 转换 (XSLT) 转换 XML 文档的应用程序。这是使用 TornadoFX 构建的(可以找到源代码 here)。我正在尝试使用转换的状态更新状态标签,这是在扩展 Controller 的类中完成的。但是由于某种原因,状态标签什么也没显示。
我的转换器类的来源:
class Transformer : Controller() {
private val statusProperty = SimpleStringProperty("")
var status by statusProperty
fun transform(xml: File, xslt: File, result: StreamResult) {
runLater { status = "" }
// create the DOM Source
val factory = DocumentBuilderFactory.newInstance()
factory.isNamespaceAware = true
val builder = factory.newDocumentBuilder()
val bbcDoc = builder.parse(xml)
val source = DOMSource(bbcDoc)
// Create an instance of the TransformerFactory
val transfomerFactory = TransformerFactory.newInstance()
val transformer = transfomerFactory.newTransformer(StreamSource(xslt))
.apply {
setOutputProperty(OutputKeys.INDENT, "yes")
setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4")
}
runLater {
try {
transformer.transform(source, result)
status = "Completed successful"
} catch (e: Exception) {
status = e.message
}
}
}
}
主屏类:
class MainScreen : View("XSLT Transformer") {
val status: TaskStatus by inject()
val model: TransformerModel by inject()
val transformer: Transformer by inject()
private val xmlFilter = arrayOf(FileChooser.ExtensionFilter("XML Filer (*.xml)", "*.xml"))
private val xsltFilter = arrayOf(FileChooser.ExtensionFilter("XSLT Filer (*.xslt)", "*.xslt"))
private lateinit var xmlInput: TextField
private lateinit var xsltInput: TextField
override val root = form {
fieldset(labelPosition = Orientation.VERTICAL) {
field("XSLT fil") {
...
}
field("XML Input Fil") {
...
}
button("Konverter") {
enableWhen(model.valid)
isDefaultButton = true
useMaxWidth = true
action {
// An object to hold the results. It can be a file.
// val writer = System.out
val output = StreamResult(StringWriter())
runAsyncWithProgress {
try {
transformer.status = "Konverterer xml fil..."
transformer.transform(File(xmlInput.text), File(xsltInput.text), output)
transformer.status = "Færdig"
} catch (e: Exception) {
transformer.status = e.message
}
} ui {
showDialogResult(output)
transformer.status = "Completed"
}
}
}
}
label(transformer.status) {
style {
paddingTop = 10
textFill = Color.RED
fontWeight = FontWeight.BOLD
}
}
}
}
【问题讨论】:
标签: tornadofx