使用包含具有相对路径的其他样式表的远程样式表

时间:2010-07-28 23:54:30

标签: python lxml docbook xslt

我想使用lxml.etree.XSLT对DocBook文档进行XSL转换。

虽然文档提到etree.XSLT()采用xslt_input的第一个参数,但我似乎找不到任何关于此参数的文档。传递一个打开阅读的文件似乎工作;在字符串中传递文件名不会。

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

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

我想使用这个类来转换DocBook文档,并且希望能够远程访问DocBook XSL。 Docbook XSL非常复杂,包含许多其他文件。有没有办法让etree.XSLT从远程位置提取这些文件?

2 个答案:

答案 0 :(得分:1)

这实际上很容易,我只是心理消化不良,忘记了解析XSL样式表的那个非常重要的中间步骤。就在那时,您让它知道样式表的基本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。

答案 1 :(得分: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)