Соответствие следующему и шаблон вызова

Это упрощенный 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:ifmatch="footnote" mode="footnote"):

    <xsl:if test="preceding::node()[page[1]]">
        <xsl:variable name="op">&#60;</xsl:variable>
        <xsl:variable name="apos">'</xsl:variable>
        <xsl:variable name="cl">&#62;</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).

Другие вопросы по тегам