2012-05-17 118 views
3

我需要爲我寫了一個xsl功能當前節點的XPath獲取當前節點的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。請幫忙。

+0

Evem在修復了明顯的錯誤之後,生成的表達式通常會是正確的。爲什麼?因爲在一般情況下,這個XPath表達式選擇了許多元素 - 不僅僅是一個。 –

+0

你會遇到任何問題,你有兩個同名的兄弟姐妹 - ''會給你兩個''節點的相同表達式。你應該找到一種方法來添加'[1]','[2]'等等,可能使用'position()'函數或'兄弟之前的軸'。 – Flynn1179

回答

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> 

變量不是在這一點衆所周知。

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> 
+1

理想情況下,這個答案應該被標記爲接受! :) +1 –