Хранение данных для использования во время потоковой передачи

#xslt #saxon #xslt-3.0

#xslt #саксонский #xslt-3.0

Вопрос:

Я пытаюсь передать XML-файл с помощью XSLT3. В нем есть несколько тегов, которые представляют собой «повторно используемые» данные, которые необходимо будет использовать во время обработки повторяющихся данных (где потоковая передача выполняется).

 <Root>
    <ReusableData1>
        <ReferenceData id="1">
            <a/>
            <b/>
        </ReferenceData>
        <ReferenceData id="2">
            <a/>
            <b/>
        </ReferenceData>
    </ReusableData1>
    <RepeatingData>
        <RefId>1</RefId>
    </RepeatingData>
    <RepeatingData>
        <RefId>2</RefId>
    </RepeatingData>
 ...
</Root>
  

Я не могу просто copy-of преобразовать повторно используемые данные в переменную из-за ограничения выбора в одну сторону. Я полагаю, что здесь используются аккумуляторы, но я не могу в них разобраться. В примерах, которые я вижу, используются карты с примитивными типами, мне нужно сохранить хотя бы частичные наборы узлов, поскольку справочные данные содержат дополнительные элементы.

Ответ №1:

Это должно быть так просто, как

 <xsl:accumulator name="reusable-data" as="element(ReusableData1)">
  <xsl:accumulator-rule match="ReusableData1" select="." saxon:capture="yes"/>
</xsl:accumulator>
  

а затем позже

 <xsl:value-of select="accumulator-after('reusable-data')/ReferenceData[@id='1']/a"/>
  

Ответ №2:

В Saxon есть атрибут extension saxon:capture , см.https://www.saxonica.com/html/documentation/extensions/attributes/capture.html , это должно помочь:

Если в большом документе есть раздел с коротким заголовком, содержащий метаданные, вы можете сохранить копию заголовка в накопителе, и затем заголовок становится доступным на протяжении всей остальной обработки документа с помощью функции accumulator-after()