xslt tokenize()和"不是节点项"错误

时间:2014-11-22 20:42:31

标签: xml xslt

我使用tokenize()函数迭代一组值,但后来我尝试在模板调用中使用这个值 - “不是节点项”错误发生。

        <xsl:for-each select="tokenize($edge_pairs,';')">
                <xsl:if test="number(string-length(.)) &gt; 0">
                    <xsl:variable name="c_row" select="." as="xs:string"/>
                    <xsl:variable name="src" select="substring-before($c_row,':')" as="xs:string"/>
                    <xsl:variable name="dst" select="substring-after($c_row,':')" as="xs:string"/>
                        <xsl:call-template name="links">
                            <xsl:with-param name="src1" select="$src"/>
                            <xsl:with-param name="dst1" select="$dst"/>
                        </xsl:call-template>        
                </xsl:if>
            </xsl:for-each>

这是原始的,会触发错误:

<xsl:for-each select="root()//gml:edge[@source = $src1 and @target = $dst1 or  @source = $dst1 and @target = $src1]">

1 个答案:

答案 0 :(得分:4)

假设触发错误的代码位于命名模板links中,那么问题是您不再位于源XML文档的上下文中。您位于标记化字符串的xsl:for-each内,因此上下文是原子值(即单个字符串)。

<xsl:for-each select="tokenize(a,';')">

这意味着root()函数将无法工作,因为上下文是字符串,而不是文档对象中的节点。

解决方案是定义一个全局变量(即任何模板之外的xsl:stylesheet的子项),它引用根:

<xsl:variable name="root" select="root()" />

然后,您可以更改失败的xsl:for-each

<xsl:for-each select="$root//gml:edge[(@source = $src1 and @target = $dst1) or (@source = $dst1 and @target = $src1)]">