Использование удаленной таблицы стилей, которая включает другие таблицы стилей с относительными путями - PullRequest
1 голос
/ 29 июля 2010

Я хотел бы выполнить XSL-преобразование в документе DocBook, используя lxml.etree.XSLT.

Хотя в документации упоминается, что etree.XSLT() принимает первый параметр xslt_input, я не могунайти любые документы о том, что этот параметр должен быть.Передача файла, открытого для чтения, похоже, работает;передача ему имени файла в строке не дает.

edit После проверки работоспособности я понял, что etree.XSLT принимает проанализированный etree._ElementTree.Так .,,Может быть, есть способ проанализировать дерево элементов таким образом, чтобы дать ему путь для отображения относительных путей?,,,расследование.

Если передаваемый файл XML включает в себя другие, относительные пути в этих операторах включения берутся из текущего рабочего каталога.

Я хотел бы использовать этот класс для преобразованияДокумент DocBook и предпочел бы иметь возможность удаленного доступа к DocBook XSL.Docbook XSL довольно сложный и включает в себя множество других файлов.Есть ли способ, которым я могу заставить etree.XSLT вытащить эти файлы из удаленного места?

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Это на самом деле очень просто, у меня просто было расстройство желудка, и я забыл, что это был очень важный промежуточный шаг парсинга таблицы стилей 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 голосов
/ 29 июля 2010

Для аргумента 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)
...