使用JavaScript修改加载的XML(通过XSL在浏览器(Chrome)中显示)

时间:2013-10-23 11:02:57

标签: javascript xml xslt

我在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部分存储为模板并且可以更改。

欢迎任何其他想法! :)

提前致谢!

1 个答案:

答案 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>