我想使用lxml.etree.XSLT
对DocBook文档进行XSL转换。
虽然文档提到etree.XSLT()
采用xslt_input
的第一个参数,但我似乎找不到任何关于此参数的文档。传递一个打开阅读的文件似乎工作;在字符串中传递文件名不会。
编辑在完整性检查后,我意识到etree.XSLT
需要解析etree._ElementTree
。所以。 。 。也许有一种方法来解析一个元素树,给它一个用于映射相对路径的路径? 。 。 。调查。
如果传递的XML文件包含其他文件,那么这些include语句中的相对路径将从当前工作目录中获取。
我想使用这个类来转换DocBook文档,并且希望能够远程访问DocBook XSL。 Docbook XSL非常复杂,包含许多其他文件。有没有办法让etree.XSLT
从远程位置提取这些文件?
答案 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)