我使用tokenize()函数迭代一组值,但后来我尝试在模板调用中使用这个值 - “不是节点项”错误发生。
<xsl:for-each select="tokenize($edge_pairs,';')">
<xsl:if test="number(string-length(.)) > 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]">
答案 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)]">