Соответствие следующему и шаблон вызова
Это упрощенный XML, который раскрывает общую структуру проблемы, с которой я столкнулся.
<chapter num="07">
<title>
<page num="703"/>
... text (mixed content) ...
</title>
<page num="704"/>
<section level="sect1">
<title>...text...</title>
<para num="7.1.1">... a lot of text (mixed content)...</para>
</section>
<section level="sect1">
<title>... text... </title>
<para num="7.2.1">Some text...
<footnoteref linkend="fn3" num="3"/>
<footnote num="3" id="fn3"> ... mixed content ...</footnote>
...more text...
</para>
<page num="705"/>
<section level="sect2">
<title>...</title>
<para num="7.2.2">... text ...
<footnoteref linkend="fn4" num="4"/>
<footnote num="4" id="fn4">...</footnote>
... more text ...
<footnoteref linkend="fn5" num="5"/>
<footnote num="5" id="fn5">...</footnote>
... more text ...
</para>
<para num="7.2.5">...
<page num="706"/>...
<footnoteref linkend="fn6" num="6"/>
<footnote num="6" id="fn6"> ... </footnote>
</para>
<para num="7.2.6">... some text
<footnoteref linkend="fn7" num="7"/>
<footnote num="7" id="fn7"> ... </footnote>
</para>
</section>
</section>
</chapter>
Я должен разместить одну инструкцию по обработке <?pb label='
номер страницы'?>
до первого <footnote>
соответствует последнему предыдущему <page>
, Он должен появиться только один раз, а номер страницы должен совпадать со значением в num
атрибут последнего <page>
элемент, который появился.
Например, если я обработаю источник выше, я ожидаю сгенерировать в своем документе результата один <?pb label='704'?>
непосредственно перед <footnote num="3">
один <?pb label='705'?>
непосредственно перед <footnote num="4">
(группировка сносок 4 и 5) и одна <?pb label='706'?>
непосредственно перед <footnote num="6">
(группировка сносок 6 и 7). Существует шаблон для обработки <footnote>
элементы, и они помещаются вместе в конце каждой страницы, с предшествующей инструкцией обработки (<footnoteref>
элементы остаются там, где они есть).
Мой XSL здесь. Поскольку он слишком большой, я не могу вставить его сюда.
Я получаю дубликаты в инструкциях по обработке сносок (метки pb). Должен быть pblabel только перед первым footnote
следуя за последним page
тег. Я пытался сопоставить с preceding::page
но это не сработало. Одна и та же инструкция обработки повторяется несколько раз. Например: <?pb label='706'?>
должен появиться только один раз выше footnote 6
потому что это первый footnote
следующий page 706
,
1 ответ
Трудно сказать, не занимая много времени анализ, но попробуйте изменить это xsl:if
(в match="footnote" mode="footnote"
):
<xsl:if test="preceding::node()[page[1]]">
<xsl:variable name="op"><</xsl:variable>
<xsl:variable name="apos">'</xsl:variable>
<xsl:variable name="cl">></xsl:variable>
<xsl:value-of select="concat($op,'?pb label=',$apos,preceding::page[1]/@num,$apos,'?',$cl)"/>
</xsl:if>
К этому:
<xsl:if test="(preceding::page|preceding::footnote)[last()][self::page]">
<xsl:processing-instruction name="pb" select="concat('label=''',preceding::page[1]/@num,'''?')"/>
</xsl:if>
Довольно странно, что вы пытаетесь вывести инструкции по обработке XML, когда ваш метод вывода - это HTML (в котором есть инструкции по обработке SGML).