Выполнение XSL-преобразования ветви дерева элементов Docbook - PullRequest
2 голосов
/ 29 июля 2010

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

1 Ответ

0 голосов
/ 29 июля 2010

Вместо того чтобы пытаться применить таблицу стилей DocBook XSL к одному элементу, вы можете применить ее ко всему документу, но указать часть документа, которую вы хотите преобразовать, с помощью параметра rootid.

Из справочной документации:

Весь документ будет загружен и проанализировал, но форматирование начнется в элемент идентифицирован, а не в корень. Например, это позволяет вам обрабатывать только главу 4 книги.

Потому что весь документ доступный для процессора, автоматический нумерация, перекрестные ссылки и др. зависимости корректно разрешены.

...