2

我有一个带有javascript的XSLT,它使用“<” 和“>” 在for循环里面

<?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>
  <head> </head>
  <body>
    <script language="javascript" type="text/javascript">
  function example() {
        var trs = document.getElementsByTagName("tr");
    for (var i = 0; i &lt; trs.length; i++) {
    }
      }
     </script>
  </body>
</html>

我正在使用 PYTHON LXML 库使用 XSLT 和 XML 生成 HTML。

import lxml.etree as ET
xml = ET.parse('sample.xml')
xslt = ET.parse('sample.xsl')
transform = ET.XSLT(xslt)
content = transform(xml)
f = open('output.html','w')
f.write(ET.tostring(content , pretty_print=True))
f.close()

但是 LXML 无法替换输出 HTML 文件中的特殊字符

< 到 '<' 和 > ; 到'>'

是否有任何使用 LXML 替换“< ;”的标准做法 到'<'?

为了解决这个问题,我必须在写入文件之前编写另一段代码。

content = content.replace("&gt;", ">")
content = content.replace("&lt;", "<")
4

2 回答 2

7

为了解码/转换 HTML 实体,您应该method="html"tostring()调用中使用:

ET.tostring(content, method="html", pretty_print=True)

或者:

lxml.html.tostring(content, pretty_print=True)

演示:

from lxml import etree


text = """<html>
  <body>
    <script> 1 &lt; 2 </script>
  </body>
</html>
"""

tree = etree.fromstring(text)
print etree.tostring(tree, method="html")

印刷:

<html>
  <body>
    <script> 1 < 2 </script>
  </body>
</html>
于 2013-09-26T00:20:09.853 回答
1

您也可以将脚本内容包含在 CDATA 包装器中以阻止它被吃掉,如下所示:

<script language="javascript" type="text/javascript">
  <![CDATA[
    function example() {
          var trs = document.getElementsByTagName("tr");
      for (var i = 0; i < trs.length; i++) {
      }
    }
  ]]>
</script>
于 2013-09-26T01:58:00.817 回答