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 に答える