Я пытаюсь изменить некоторый код XSLT dblatex, который обрабатывает документы docbook в LaTeX. Мы сделали немало модов для наших местных потребностей, но у меня есть я в тупике.wrap на основе атрибута
Существует атрибут «аудитория», который может отображаться практически на любом элементе XML docbook. В наших документах большинство элементов не отмечены для этого attr, но некоторые из них отмечены как «tech», так и «nontech», например.
<chapter audience='tech'>
(lot of stuff)
</chapter>
Вместо того чтобы использовать механизм «профилирование», я хотел бы, чтобы обернуть код LaTeX, которая является результатом обработки элементов, которые имеют такой атрибут, с LaTeX тега, т.е.
\technical{ \chapter (lots of stuff) }
Мои попытка XSLT кода для выполнения этой упаковки выглядит следующим образом:
<xsl:template match=".[@audience='tech']">
<xsl:text>\technical{</xsl:text>
<xsl:apply-templates/>
<xsl:text>}</xsl:text>
</xsl:template>
к сожалению, результат этого является то, что XML-элемент, который соответствует этому шаблону не обрабатывается, только его дочери (как и следовало ожидать, когда в коде xslt нет атрибута @select). Так что, если оригинал был
<chapter role='tech'>
<section>blah blah</section>
</chapter>
то выходной LaTeX имеет код LaTeX для раздела, но не для этой главы.
Наоборот, если изменить код выше XSLT, так что имеет явное
<xsl:apply-templates select="."/>
тогда я получаю бесконечную рекурсию.
Понятно, что я хочу сказать xslt обработать элемент XML с атрибутом @audience attr, выведя оболочку LaTeX \ technical {...}, затем обработать тот же элемент, игнорируя @ аудиторию = атрибут «tech».
Есть ли способ сделать это? Я использую xslt v1 в другом месте, хотя я думаю, что если нужно использовать xslt v2, я мог бы внести изменения (не знаю, как это делается, но должно быть способ ...)
Будет ли это требовать от меня указать режим на всех элементах, разрешенных схемой, чтобы иметь значение @audience attr? Который я, конечно, не хотел бы делать (в docbook есть 100 элементов, а код dblatex уже достаточно сложный). Полагаю, мне нужно попробовать и посмотреть, могу ли я опустить «secondRun» выше. –
Вы можете опустить режим «secondRun», я включил его только для иллюстрации механизма. В общем случае, если элемент 'xsl: apply-templates' задает режим, тогда он применяет только шаблоны этого режима. В противном случае применяются шаблоны, которые не относятся к какому-либо режиму (т. Е. Поведение по умолчанию). И наоборот, шаблон, определяющий режим, может быть согласован только с помощью шаблона 'xsl: apply-templates' того же режима. – Meyer
@ Майк Максвелл, был ли этот ответ достаточным или вам нужна дальнейшая помощь? – Meyer