1

我想使用lxml.etree.XSLT.

尽管文档中提到etree.XSLT()了第一个参数xslt_input,但我似乎找不到任何有关此参数含义的文档。向它传递一个可供阅读的文件似乎可行;在字符串中传递一个文件名不会。

编辑经过健全性检查,我意识到etree.XSLT需要一个 parsed 的etree._ElementTree. 所以 。. . 也许有一种方法可以解析元素树,从而为其提供用于映射相对路径的路径?. . . 调查。

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

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

4

2 回答 2

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。

于 2010-07-29T02:13:49.790 回答
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)
于 2010-07-29T00:31:19.450 回答