xslt - वर्तमान नोड्स एक्सपेथ प्राप्त करें




reflection xpath (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>

चर उस बिंदु पर नहीं जाना जाता है

मुझे वर्तमान नोड का एक्सपैथ प्राप्त करना होगा जिसके लिए मैंने एक एक्सएसएल फ़ंक्शन लिखा है

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

लेकिन जब मैं इसे चलाता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है I

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 का उपयोग कर रहा हूँ। कृपया मदद करे।


आपके उदाहरण में आप परिभाषा में वेरिएबल का उपयोग करने की कोशिश कर रहे हैं, जो मान्य नहीं है।

ऐसा लगता है कि आपका इरादा एक मौजूदा मान के मूल्य को संशोधित करने और संशोधित करना है। हालांकि 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> 




xalan