data = open(module_path+'/data/ex-fire.xslt')
xslt_content = data.read()
这会使用默认编码将文件中的字节隐式解码为Unicode文本。(如果XML文件不是该编码,则可能会导致错误的结果。)
xslt_root = etree.XML(xslt_content)
XML具有自己的编码处理方式和信令,即<?xml encoding="..."?>
序言。如果您将一个以Unicode字符串开头的代码<?xml encoding="..."?>
传递给解析器,则解析器希望使用该编码来重新声明字节字符串的其余部分…但是不能,因为您已经将输入的字节解码为Unicode字符串。
相反,您应该将未解码的字节字符串传递给解析器:
data = open(module_path+'/data/ex-fire.xslt', 'rb')
xslt_content = data.read()
xslt_root = etree.XML(xslt_content)
或者更好的是,让解析器直接从文件中读取:
xslt_root = etree.parse(module_path+'/data/ex-fire.xslt')