#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()