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.