Javascript 使用Tornado提供用xsl格式化的xml

Javascript 使用Tornado提供用xsl格式化的xml,javascript,python,xml,xslt,tornado,Javascript,Python,Xml,Xslt,Tornado,我试图让tornado提供一个xml文件,并使用xsl对其进行转换 我正在使用: openGET,url,true;和xmlhttp.send;在javascript/html中 Python中的self.rendercd_catalog.xml document.getElementByIdmyDiv.innerHTML=xmlhttp.responseText;在javascript/html中 结果是一个非格式化的xml文件 为什么xsl不转换xml?我错过了什么 Python: impo

我试图让tornado提供一个xml文件,并使用xsl对其进行转换

我正在使用:

openGET,url,true;和xmlhttp.send;在javascript/html中

Python中的self.rendercd_catalog.xml

document.getElementByIdmyDiv.innerHTML=xmlhttp.responseText;在javascript/html中

结果是一个非格式化的xml文件

为什么xsl不转换xml?我错过了什么

Python:

import os
import tornado.httpserver
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
            self.render("index.html")
class Test(tornado.web.RequestHandler):
    def get(self):
            self.render("cd_catalog.xml")

def main():
    application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/Test", Test),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    port = int(os.environ.get("PORT", 5003))
    http_server.listen(port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
 main()
JS/HTML:

    <!DOCTYPE html>
    <html>
    <head>
    <script>
    function loadXMLDoc(url)
    {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
      }
    xmlhttp.open("GET",url,true);
    xmlhttp.send();
    }
    </script>
    </head>
    <body>

    <div id="myDiv"><h2>get list of presidents</h2></div>
    <button type="button" onclick="loadXMLDoc('/Test')">OK</button>

    </body>
    </html>
XML:

XSL:


Tornado没有应用XSL,因为您没有要求它应用XSL。相反,通过使用RequestHandler.render,您要求Tornado将文件呈现为Tornado模板,并将结果发送到浏览器。相反,您应该通过您选择的XSL处理器显式运行该文件,然后使用RequestHandler.write将结果发送到浏览器。

谢谢。下面是一个例子:

    import os
    import tornado.httpserver
    import tornado.ioloop
    import tornado.web
    import lxml.etree as ET

    class MainHandler(tornado.web.RequestHandler):
            def get(self):
                    self.render("index.html")
    class Test(tornado.web.RequestHandler):
            def get(self):
                    dom = ET.parse("cd_catalog.xml")
                    xslt = ET.parse("cd_catalog.xsl")
                    transform = ET.XSLT(xslt)
                    newdom = transform(dom)
                    self.write(ET.tostring(newdom, pretty_print=True))

    def main():
            application = tornado.web.Application([
            (r"/", MainHandler),
            (r"/Test", Test),
            ])
            http_server = tornado.httpserver.HTTPServer(application)
            port = int(os.environ.get("PORT", 5003))
            http_server.listen(port)
            tornado.ioloop.IOLoop.instance().start()

    if __name__ == "__main__":
        main()

非常感谢,这很有道理。您是否建议使用lxml在python中转换xml?我从未使用过XSL,因此这里没有任何建议。
    <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
      <html>
      <body>
      <h2>My CD Collection</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
        <xsl:for-each select="catalog/cd">
        <tr>
          <td><xsl:value-of select="title"/></td>
          <td><xsl:value-of select="artist"/></td>
        </tr>
        </xsl:for-each>
      </table>
      </body>
      </html>
    </xsl:template>

    </xsl:stylesheet>
    import os
    import tornado.httpserver
    import tornado.ioloop
    import tornado.web
    import lxml.etree as ET

    class MainHandler(tornado.web.RequestHandler):
            def get(self):
                    self.render("index.html")
    class Test(tornado.web.RequestHandler):
            def get(self):
                    dom = ET.parse("cd_catalog.xml")
                    xslt = ET.parse("cd_catalog.xsl")
                    transform = ET.XSLT(xslt)
                    newdom = transform(dom)
                    self.write(ET.tostring(newdom, pretty_print=True))

    def main():
            application = tornado.web.Application([
            (r"/", MainHandler),
            (r"/Test", Test),
            ])
            http_server = tornado.httpserver.HTTPServer(application)
            port = int(os.environ.get("PORT", 5003))
            http_server.listen(port)
            tornado.ioloop.IOLoop.instance().start()

    if __name__ == "__main__":
        main()