xsl with when template sort example condicional choose xslt reflection xpath xslt-1.0 xalan

xslt - with - Obtenga los nodos actuales xpath



xslt order by (2)

Necesito obtener el xpath del nodo actual para el que he escrito una función xsl

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

Pero cuando ejecuto esto, obtengo el siguiente error

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

Estoy usando xalan 2.7.0. Por favor ayuda.


En su ejemplo, intenta usar la variable en la definición en sí, que no es válida.

Parece que tu intención es tratar de modificar el valor de un valor existente. Sin embargo, XSLT es un lenguaje funcional y, como resultado, las variables son inmutables. Esto significa que no puede cambiar el valor una vez definido.

En este caso, no necesita ser tan complicado. Simplemente puede eliminar la referencia a la variable en sí, y obtendrá el resultado que necesita

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


Está utilizando la variable $xpath dentro de la definición de la variable en sí:

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

La variable no se conoce en ese punto.