Я бы хотел использовать таблицы стилей docbook XSL для рендеринга различных частей документа без преобразования всего элемента.
Сложность состоит в том, что некоторые из этих частей имеют <footnoteref>
элементы, чьи linkend
атрибуты не находятся внутри одного и того же блока.Другими словами, я хочу обработать ветвь дерева, которая включает <footnoteref>
s, но не элементы <footnote>
, на которые они ссылаются.
Мои попытки сделать это с помощью пакета Python lxml
привели кэто сообщение об ошибке:
XSLTApplyError Traceback (most recent call last)
/var/www/mpd/<ipython console> in <module>()
/var/www/mpd/<ipython console> in <genexpr>((elt,))
/usr/lib/python2.6/dist-packages/lxml/etree.so in lxml.etree.XSLT.__call__ (src/lxml/lxml.etree.c:109204)()
XSLTApplyError: Internal error in xsltKeyFunction(): Could not get the document info of a context doc.
Это происходит в ответ, например, etree.XSLT(etree.parse('docbook.xsl'))(some_element)
.
Я использую обычные таблицы стилей xhtml
.Я не ожидал, что это будет иметь значение, какую таблицу стилей я использую.
Есть ли поддерживаемый способ сделать это?Или я ожидаю, например, применить XSLT-преобразование к документу, чтобы изменить элемент <footnoteref>
на элемент <footnote>
перед выполнением этого рендеринга?Но тогда это не сработает, потому что тогда будет несколько <footnote>
тегов с одинаковым идентификатором.Преобразование <footnoteref>
в <footnote>
должно быть выполнено только в том случае, если тег <footnote>
не будет включен в результирующее дерево.Что я ожидал бы уже происходить.Но, надеюсь, я где-то пропустил переключатель.
edit
Благодаря ответу @ Jukka я понял, что могу передать rootid параметр, чтобы указать процессору XSLT просто визуализировать этот идентификатор.Тем не менее, он делает это слишком верно, создавая вывод, который просто ссылается на сноску с тем же фрагментом, который был бы полезен, если бы документ отображался как одна HTML-страница.EG
>>> xsl_url_html = 'http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl'
>>> from lxml import etree
>>> consume_result = etree.XSLT(etree.parse(xsl_url_xhtml))(
etree.parse(my_xml_file), rootid=etree.XSLT.strparam("command_consume"))
>>> etree.tostring(consume_result).split('\n')
['<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ASCII" /><title></title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2" /></head><body><dt><a id="command_consume"></a><span class="term">',
' <div class="cmdsynopsis"><p><code class="command">consume</code> {<em class="replaceable"><code>STATE</code></em>}</p></div>',
' </span></dt><dd><p>',
' <sup>[<a href="#ftn.since_0_15" class="footnoteref">2</a>]</sup>',
' Sets consume state to <code class="varname">STATE</code>,',
' <code class="varname">STATE</code> should be 0 or 1.',
'\t When consume is activated, each song played is removed from playlist.',
' </p></dd></body></html>']
Может быть, есть другой параметр, который заставит сноски отображаться на той же странице, желательно с номером 1?Я думаю, это, вероятно, было бы где-то в этом списке .Я пройду через это, когда у меня будет больше времени.