2012-01-12 12 views
6

हाय मैं निम्न फ़ाइलों को मिल गया:lxml और XSL दस्तावेज़() समारोह

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> 

बी.एक्सएमएल:

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

4 फ़ाइलें एक ही निर्देशिका में कर रहे हैं, जब मैं merge.py फोन मैं त्रुटि मिली:

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

किसी भी विचार? मैं क्या गलत करता हूँ?

+0

और यदि मैं का उपयोग करता हूं, तो मुझे lxml.etree.XSLTApply त्रुटि मिलती है: URI फ़ाइल को हल नहीं कर सकता: //b.xml – Seb

उत्तर

8

आपको एक यूआरआई रिज़ॉल्वर पंजीकृत करने की आवश्यकता है। the documentation देखें।

शायद यह (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)) 
+0

हाय फ्रांसिस, धन्यवाद, जिसने मुझे भी मदद की। मुझे एक मुद्दा है हालांकि, मैं आउटपुट एचटीएमएल को एचटीएमएल फाइल के रूप में कैसे सहेजूं? – Christopher

6

क्यों बस ऐसा नहीं?

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)) 

अधिक सरल, किसी रिज़ॉल्वर की आवश्यकता नहीं है।