Порядок элементов, которые должны быть учтены в XSLT-функции 'count' - PullRequest
0 голосов
/ 18 сентября 2018

В моем файле XSLT есть инструкция, которая подсчитывает узлы и выдает номер гиперссылки с надстрочным индексом рядом со словом, к которому прикреплена заметка, а также саму заметку (с пронумерованной гиперссылкой):

<xsl:template match="//tei:body//tei:note">
    <a>
        <xsl:attribute name="name">
            <xsl:text>footnoteref</xsl:text>
            <xsl:number level="any" count="//tei:body//tei:note" format="1"/>
        </xsl:attribute>
        <xsl:attribute name="href">
            <xsl:text>#footnote</xsl:text>
            <xsl:number level="any" count="//tei:body//tei:note" format="1"/>
        </xsl:attribute>
        <sup>
            <xsl:number level="any" count="//tei:body//tei:note" format="1"/>
        </sup>
    </a>
</xsl:template>

<xsl:template match="tei:note" mode="footnote">
    <br>
        <a>
            <xsl:attribute name="name">
                <xsl:text>footnote</xsl:text>
                <xsl:number level="any" count="//tei:body//tei:note" format="1"/>
            </xsl:attribute>
            <xsl:attribute name="href">
                <xsl:text>#footnoteref</xsl:text>
                <xsl:number level="any" count="//tei:body//tei:note" format="1"/>
            </xsl:attribute>
            <xsl:number level="any" count="//tei:body//tei:note" format="1"/>.

        </a>
        <xsl:text> </xsl:text>
        <xsl:apply-templates/>
        </i>
    </br>
</xsl:template>

[...]

<xsl:apply-templates select="//tei:body//tei:note" mode="footnote"/>

Все отлично работает.Тем не менее, я хотел бы контролировать порядок, в котором элементы <note> подсчитываются.Например, если это мой .xml:

<body>
    <div>
        <p>Bla<note>This is a second note</note> blabla</p>
    </div>
    <div>
        <p>Bla2<note>This is a first note</note> bla bla...</p>
    </div>
</body>

Я бы хотел, как я сказал в тексте, вывести «1» для заметки «Это первая заметка» и«2» для заметки «Это вторая заметка», даже если в файле .xml они располагаются в другом порядке.

Что касается вывода, я уже выводю текст в нужном мне порядке.с чем-то вроде этого в начале моего файла XSLT:

<!-- Order of execution -->
<xsl:template match="tei:text/tei:body/tei:div">
    <xsl:apply-templates select="tei:opener/tei:dateline"/>
    <xsl:apply-templates select="tei:opener/tei:salute"/>
    <xsl:apply-templates select="tei:p [not(tei:stamp)] [not(tei:address)] [not(tei:postscript)]"/>
    <xsl:apply-templates select="tei:closer/tei:salute"/>
    <xsl:apply-templates select="tei:closer/tei:signed"/>
    <xsl:apply-templates select="tei:closer/tei:dateline"/>
    <xsl:apply-templates select="tei:postscript"/>
    <xsl:apply-templates select="tei:stamp"/>
</xsl:template>

с результатом, что текст находится в том порядке, в котором я его хочу, и номер заметки идет, например, из верхней части документаот 1 до 8, с '9' между '5' и '6', потому что соответствующая нота находится в tei: dateline.

Как я могу сказать 'count' для подсчета<note> элементов в нужном мне порядке, независимо от того, в каком порядке они появляются в XML-файле?

1 Ответ

0 голосов
/ 18 сентября 2018

Я думаю, вам нужно решение с двумя проходами.Сгенерируйте выходные данные в том порядке, в котором вы хотите на первом этапе, затем выполните нумерацию на втором этапе.

Существует два способа выполнить двухпроходное преобразование в XSLT: вы можете поместить результаты первогофазировать в переменную, затем обрабатывать содержимое переменной;или вы можете использовать две отдельные таблицы стилей.Какой подход лучше, зависит от того, насколько тесно вы хотите, чтобы эти два прохода были.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...