【问题标题】:Using a remote stylesheet that includes other stylesheets with relative paths使用包含具有相对路径的其他样式表的远程样式表
【发布时间】:2010-07-28 23:54:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python lxml docbook xslt


    【解决方案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。

    【讨论】:

    • etree.parse 的完整文档似乎是 here
    【解决方案2】:

    xslt_input 参数需要一个 XSL 文档。

    这是来自http://snipplr.com/view/19433/lxml-xslt/的使用sn-p:

    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)
    

    【讨论】:

    • 我认为您没有理解这个问题。我需要告诉 XSLT 对象如何扩展顶级 XSL 文件中包含/导入语句使用的相对路径。
    • 你可能就在那儿。我认为问题主要是关于需要传递给__init__ 方法的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2013-02-05
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多