LXML and XSL function document ()

Hi, I received the following files:

merge.py:

from lxml import etree xml_input = etree.XML(open('a.xml', 'r').read()) xslt_root = etree.XML(open('merge.xsl', 'r').read()) transform = etree.XSLT(xslt_root) print str(transform(xml_input)) 

merge.xsl:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <merge> <xsl:copy-of select="."/> <xsl:copy-of select="document('b.xml')"/> </merge> </xsl:template> 

a.xml:

 <?xml version="1.0" encoding="ISO-8859-1"?> <a> <test id="1"/> </a> 

b.xml:

 <?xml version="1.0" encoding="ISO-8859-1"?> <b> <test id="2"/> </b> 

The 4 files are in the same directory when I call merge.py. I got an error:

 lxml.etree.XSLTApplyError: Cannot resolve URI string://__STRING__XSLT__/b.xml 

Any idea? what am I mistaken on?

+6
source share
2 answers

You need to register a URI solution. See the documentation .

Maybe something like this (untested):

 class FileResolver(etree.Resolver): def resolve(self, url, pubid, context): return self.resolve_filename(url, context) parser = etree.XMLParser() parser.resolvers.add(FileResolver()) xml_input = etree.parse(open('a.xml','r'), parser) xslt_root = etree.parse(open('merge.xsl','r'), parser) transform = etree.XSLT(xslt_root) print str(transform(xml_input)) 
+8
source

Why not just do it?

 from lxml import etree xml_input = etree.parse("a.xml") xslt_root = etree.parse("merge.xsl") transform = etree.XSLT(xslt_root) print str(transform(xml_input)) 

More simply, there is no need for a recognizer.

+6
source

Source: https://habr.com/ru/post/905799/


All Articles