XSLT管道:错误XPDY0002-轴步骤fn:root(...)/ element()的上下文项不存在

时间:2019-01-24 11:27:12

标签: saxon

请,我需要一些有关saxon api的帮助:) 我用相同的xslt的2个XsltTransform创建了一个管道,当我运行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用作另一个进程的Destination的情况下,将忽略此值。在这种情况下,初始上下文节点将始终是流式传输到此目的地的文档的文档节点。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

通常,在XSLT 3中,您需要区分用于决定首先应用哪个模板的初始匹配选择https://www.w3.org/TR/xslt-30/#dt-initial-match-selection和用于评估全局参数的全局上下文项https://www.w3.org/TR/xslt-30/#dt-global-context-item之间的区别。变量。我认为您似乎希望在第二个样式表中第一个样式的结果同时起作用,但是,至少在您的设置中,Saxon似乎并不假定这样做,而只是将初始匹配项设置为第一个样式表的结果。因此,请尝试将<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>

我不确定是否有另一种方法,至少在链接两个流转换的情况下,您不能让第二个样式表期望能够访问第一个样式表的整个结果树以用于评估全局参数或变量