Конвейер XSLT: ошибка XPDY0002 - элемент контекста для шага оси fn: root (...) / element () отсутствует - PullRequest
0 голосов
/ 24 января 2019

Пожалуйста, мне нужна помощь по работе с saxon api :) Я создаю конвейер с 2 XsltTransform того же самого xslt, и когда я запускаю transform, я получаю эту ошибку:

2019-01-24 11:32:15,673 [pool-2-thread-1] INFO e.s.e.x.XsltListener - file
2019-01-24 11:32:15,674 [pool-2-thread-1] INFO e.s.e.x.XsltListener - Error 
XPDY0002 while evaluating xsl:message content: The context item for axis 
step fn:root(...)/element() is absent

вот мой xslt:

<xsl:stylesheet exclude-result-prefixes="#all" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="supp" as="xs:string" select="root()/*/name()"/>

<xsl:template match="/">
    <xsl:message select="$supp"/>
    <file/>
</xsl:template>

первый XsltTransform работает нормально, но кажется, что у меня нет узла контекста во время второго запуска XstTransform.

Я использую:

transformer1.setSource(source) : source is a SAXSource

transformer1.setDestination(transformr2)

transformr2.setDestination(serialiser)

Согласно документации(XsltTransform.setInitialContextNode): это значение игнорируется в случае, когда XsltTransformer используется в качестве пункта назначения другого процесса.В этом случае начальный контекстный узел всегда будет узлом документа документа, который передается в это место назначения.

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 25 января 2019

Как правило, в XSLT 3 необходимо различать начальный выбор совпадения https://www.w3.org/TR/xslt-30/#dt-initial-match-selection, который используется для определения, какой шаблон применять первым, и элемент глобального контекста https://www.w3.org/TR/xslt-30/#dt-global-context-item, который используется для оценки глобального параметры и переменные. Я думаю, вы ожидаете, что в вашей второй таблице стилей результат ваших первых действий будет одинаковым, но, по-видимому, по крайней мере, в вашей настройке Саксон не предполагает этого, а только устанавливает первоначальный выбор совпадения на результат первой таблицы стилей. Поэтому попробуйте переместить <xsl:variable name="supp" as="xs:string" select="root()/*/name()"/> в шаблон, например,

<xsl:template match="/">
    <xsl:variable name="supp" as="xs:string" select="root()/*/name()"/>
    <xsl:message select="$supp"/>
    <file/>
</xsl:template>

Я не уверен, что есть другой способ, по крайней мере, в случае объединения двух потоковых преобразований вы не можете ожидать, что вторая таблица стилей будет иметь доступ ко всему дереву результатов первого, которое будет использоваться для оценки глобальных параметров или переменных .

...