Подсчет элементов после преобразования документа с помощью XSLT с потоковой передачей - PullRequest
0 голосов
/ 13 июля 2020

Для выполнения задачи из предыдущего вопроса мне также нужно подсчитать определенные элементы документа, который я получаю после того, как преобразование было выполнено. Обычно при работе с небольшими документами можно просто поместить исходный результат в переменную, а затем применить к ней шаблоны, что-то вроде

<xsl:template match=/*>
    <xsl:variable name="phase1">
        <Transformed>
            ...
        </Transformed>
    </xsl:variable>

    <xsl:apply-templates mode="step2" select="$phase1/*"/>

</xsl:template>

<xsl:template match="node() | @*" mode="step2">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*" mode="step2"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/Transformed/DocumentTotal/text()" mode="step2">
   <xsl:value-of select="count(/Transformed//*[some predicate here]"/>
</xsl:template>

Но я должен иметь возможность обрабатывать большие документы, поэтому я ни копировать результат в переменную, ни обрабатывать его в непотоковом режиме. Я взглянул на <xsl:accumulator и уже написал, что один позволяет мне подсчитывать определенные элементы в исходном документе, но теперь я застрял, не имея представления, как выполнить такой подсчет элементов в результат документ, может кто-нибудь мне помочь, пожалуйста?

1 Ответ

1 голос
/ 13 июля 2020

Для этого существует целый ряд техник, ни одна из которых не является особенно удовлетворительной. Они включают:

(a) выполнить еще один проход по выходному документу: (a1) в той же таблице стилей XSLT, используя переменную (a2) во второй таблице стилей XSLT (a3) ​​с использованием какой-либо технологии, отличной от XSLT, например, SAX-фильтр пост-обработки

(b) запускает некоторые вычисления во входном документе, которые определяют, сколько элементов будет присутствовать в результате, независимо от фактического получения этих результатов. Их жизнеспособность, конечно, сильно зависит от реальных условий.

(c) используйте некоторое расширение процессора, которое позволяет вам увеличивать счетчик в качестве побочного эффекта генерации элемента вывода (например, saxon : assign - это основной вариант использования для сохранения этой инструкции).

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