У меня есть следующий код xslt:
<xsl:template match="table_terms_and_abbr">
<informaltable frame='none' colsep='none' rowsep='none'>
<tgroup cols='2' align='left'>
<colspec colnum="1" colwidth='1*'/>
<colspec colnum="2" colwidth='1*'/>
<xsl:apply-templates/>
</tgroup>
</informaltable>
</xsl:template>
и следующий XML, который он обрабатывает:
<table_terms_and_abbr>
<tblrow_hdr>Name ,, Description</tblrow_hdr>
<tbody>
<tblrow_bold_first> BOT ,, &j_bot;</tblrow_bold_first>
...
</tbody>
</table_terms_and_abbr>
Теперь я хочу улучшить xslt, перемещая следующие строки внутри table_terms_and_abbr
:
<tblrow_hdr>Name ,, Description</tblrow_hdr>
<tbody>
</tbody>
Так что у меня будет что-то вроде:
<xsl:template match="table_terms_and_abbr">
<informaltable frame='none' colsep='none' rowsep='none'>
<tgroup cols='2' align='left'>
<colspec colnum="1" colwidth='1*'/>
<colspec colnum="2" colwidth='1*'/>
<xsl:call-template name="tblrow_hdr">
BOT ,, &j_bot; * ???? *
</xsl:call-template>
<tbody>
<xsl:apply-templates/>
</tbody>
</tgroup>
</informaltable>
</xsl:template>
Строка, помеченная * ???? * не работает. Я использовал saxon9 (таблица стилей xslt 2.0) на платформе Linux и получил эту ошибку:
XTSE0010: В xsl: call-template запрещены никакие символьные данные
Я знаю, как передать атрибуты в шаблон, т.е.:
<xsl:with-param name="is_make_first_bold" select = "1" as="xs:integer"/>
а как передать свободный текст?
Идея состоит в том, чтобы перенести в шаблон все статические данные и в xml использовать только переменные данные, т.е.
<table_terms_and_abbr>
<tblrow_bold_first> BOT ,, &j_bot;</tblrow_bold_first>
...
</table_terms_and_abbr>
Подробнее
Моим требованием было создать упрощенный синтаксис для определения повторяющихся таблиц для нашей документации DocBook. Для этого я создал общий шаблон с именем tblrow
, который разделит строку, разделенную ",,", на отдельные сущности и создаст список записей в строке таблицы.
Каждая запись может быть простой строкой, ENTITY или другим шаблоном.
Так как номера параметров не определены (таблицы могут иметь разное количество ячеек), я не могу использовать стандартные параметры для шаблонов и строку с разделителями. Если я хочу, чтобы одна из записей таблицы содержала ссылку на какое-то место в документе, я не могу снова использовать параметры, поскольку не могу передать шаблон внешней ссылки в качестве параметра.
Основная причина не менять шаблон tblrow
в том, что он работает :) и это довольно сложно. Мне потребовались годы, чтобы достичь этого, и я не совсем понимаю, как это работает :).
Теперь у меня есть несколько переменных, которые могут управлять отображаемым выводом, например tblrow_hdr
, который будет подчеркивать и выделять текст в каждой записи. Так как tblrow_hdr
является общим для всех table_terms_and_abbr
таблиц, для меня просто логично, что я не имею этого в xml, вместо этого поставлю вызов tblrow_hdr
внутри шаблона table_terms_and_abbr
и вот я застрял.