3

我需要获取我为其编写了 xsl 函数的当前节点的 xpath

<func:function name="fn:getXpath">
    <xsl:variable name="xpath">
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="concat($xpath, name())" />
            <xsl:if test="not(position()=last())">
                <xsl:value-of select="concat('/', $xpath)" />
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <func:result select="$xpath" />
</func:function>

但是当我运行它时,我收到以下错误

file:///D:/test.xsl; Line #165; Column #63; Variable accessed before it is bound!
file:///D:/test.xsl; Line #165; Column #63; java.lang.NullPointerException

我正在使用 xalan 2.7.0。请帮忙。

4

2 回答 2

6

在您的示例中,您试图在定义本身中使用该变量,这是无效的。

看起来您的意图是尝试修改现有值的值。然而 XSLT 是一种函数式语言,因此变量是不可变的。这意味着一旦定义,您就无法更改该值。

在这种情况下,您不需要那么复杂。您可以只删除对变量本身的引用,您将获得所需的结果

<func:function name="fn:getXpath">
   <xsl:variable name="xpath">
      <xsl:for-each select="ancestor-or-self::*">
         <xsl:value-of select="name()"/>
         <xsl:if test="not(position()=last())">
            <xsl:value-of select="'/'"/>
         </xsl:if>
      </xsl:for-each>
   </xsl:variable>
   <func:result select="$xpath" />
</func:function> 
于 2012-05-17T14:11:52.580 回答
2

您正在$xpath变量本身的定义中使用该变量:

<func:function name="fn:getXpath">
    <xsl:variable name="xpath">  
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="concat($xpath, name())" />   <-------
            <xsl:if test="not(position()=last())">
                <xsl:value-of select="concat('/', $xpath)" />  <-------
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <func:result select="$xpath" />
</func:function>

那个时候这个变量是未知的。

于 2012-05-17T13:39:56.377 回答