我在Chrome浏览器控件(CefSharp.Wpf)中显示以下XML文档:
<?xml-stylesheet type="text/xsl" href="#"?>
<xsl:stylesheet version="1.0" xmlns:data="x" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<data:data>
<log>
<entry>
<message>first</message>
</entry>
<entry>
<message>second</message>
</entry>
</log>
</data:data>
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates select="data:data" />
</xsl:template>
<xsl:template match="log">
<html>
<body>
<xsl:for-each select="entry">
<xsl:value-of select="message" /><br />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
现在我想通过JavaScript(实时日志窗口)添加新的<entry>
。甚至可以改变XML'live'吗?即使我删除了一个节点,浏览器也没有更新他的视图。
我不想在添加新条目时重新加载整个文档(需要大约80毫秒)。我不想在浏览器中编写直接HTML,因为xsl-template部分存储为模板并且可以更改。
欢迎任何其他想法! :)
提前致谢!
答案 0 :(得分:1)
在现代浏览器中,您可以从Javascript重新运行转换。只需要访问原始的XML文件。
请参阅以下示例HTML:
<!DOCTYPE html>
<html>
<head>
<script>
function sjax(url) {
var req = new XMLHttpRequest();
req.open("GET",url,false);
req.send(null);
return req.responseXML;
}
function transformBody(data, template) {
while ((e = document.body.firstChild) !== null) {
document.body.removeChild(e);
}
var processor = new XSLTProcessor();
processor.importStylesheet(template);
var resultFragment = processor.transformToFragment(data, document);
document.body.appendChild(resultFragment);
}
var data = sjax("data.xml");
var xslt = sjax("template.xslt");
window.addEventListener("load", function (e) {
transformBody(data, xslt);
}, false);
window.addEventListener("click", function (e) {
data.documentElement.querySelector("log")
.appendChild(data.createElement("entry"))
.appendChild(data.createElement("message"))
.appendChild(data.createTextNode("new node"));
transformBody(data, xslt);
}, false);
</script>
</head>
<body>
</body>
</html>
<强> data.xml中强>
<?xml version="1.0" encoding="UTF-8"?>
<data:data xmlns:data="x">
<log>
<entry>
<message>first</message>
</entry>
<entry>
<message>second</message>
</entry>
</log>
</data:data>
<强> template.xslt 强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:data="x" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates select="data:data" />
</xsl:template>
<xsl:template match="log">
<html>
<body>
<xsl:for-each select="entry">
<xsl:value-of select="message" /><br />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>