2010-07-28 31 views
1

我想使用lxml.etree.XSLT对DocBook文档执行XSL转换。使用包含具有相对路径的其他样式表的远程样式表

尽管文档中提到etree.XSLT()采用xslt_input的第一个参数,但我似乎无法找到有关该参数意味着什么的任何文档。传递给读者的文件似乎有效;在字符串中传递一个文件名不会。

编辑经过完整性检查后,我意识到etree.XSLT需要解析etree._ElementTree。所以。 。 。也许有一种方法来解析一个元素树的方式,给它一个路径来使用映射相对路径? 。 。 。调查。

如果传递的XML文件包含其他文件,那些包含语句中的相对路径将从当前工作目录中获取。

我想使用这个类来转换一个DocBook文档,并希望能够远程访问DocBook XSL。 Docbook XSL相当复杂,并且包含许多其他文件。有没有一种方法可以使etree.XSLT从远程位置获取这些文件?

回答

0

xslt_input参数需要XSL文档。

这里使用的片段从http://snipplr.com/view/19433/lxml-xslt/

from lxml.etree import XSLT,fromstring 

xml = fromstring("<a key='value'>ez</a>") 
xsl= fromstring("""<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method = "html" version="1.0" encoding="UTF-8" omit-xml-declaration="yes" standalone="yes" indent="no" /> 

    <xsl:template match="a"> 
     <xsl:value-of select="@key"/> 
    </xsl:template> 

</xsl:stylesheet>""") 

style = XSLT(xsl) 
result = style.apply(xml) 
print style.tostring(result) 
+0

我不认为你理解这个问题。我需要告诉XSLT对象如何扩展顶层XSL文件中include/import语句使用的相对路径。 – intuited 2010-07-29 00:54:14

+0

你可能就在那里。我认为这个问题主要是关于需要传递给'__init__'方法的问题。 – 2010-07-29 02:16:42

1

这实际上是死很容易,我只是有心理消化不良,忘了,有是解析XSL样式表的所有重要的中间步骤。在这一点上,你让它知道样式表的基本URL。

如果从URL获取样式表,它只是从URL中扣除它。起初我并没有意识到这是一种选择,这可能是我混乱的开始。

否则,您可以通过参数base_url传递位置。

三个简单的步骤:

>>> xsl_url = 'http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl' 
>>> document = 'path/to/document.xml' 
>>> output_filename = 'path/to/transformed-document.xhtml' 
>>> from lxml import etree 
>>> transform = etree.XSLT(etree.parse(xsl_url)) 
>>> with open(document) as f: 
>>>  transformed_document = transform(etree.parse(f)) 
>>> transformed_document.write(output_filename) 

瞧!

我一直在做的是从本地文件初始化样式表etree,主要是因为我没有意识到我可以传递一个URL。

+0

'etree.parse'的完整文档似乎是[here](http://codespeak.net/lxml/api/lxml.etree-module.html#parse)。 – intuited 2010-07-29 02:27:29