Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XSLT can not query input XML from within function

Tags:

xslt

xslt-2.0

I am trying to create a function that takes one pram and then queries the input XML in several ways based on the input. My problem is that when I try to query the input xml and store a value in a variable while in the function I get the error:

'/' cannot select the root node of the tree containing the context item: the context item is absent

How can I query the XML from within the function? Below is the XSLT

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:lang="info:lc/xmlns/codelist-v1" 
    xmlns:foo="http://whatever">

    <xsl:output indent="yes" />

   <xsl:function name="foo:get-prefered">
       <xsl:param name="field-name"/> 
       <xsl:variable name="var1" select="sources/source[@type='A']/name" />
    </xsl:function>

    <xsl:template match="/">
        <xsl:value-of select="foo:get-prefered(10)"></xsl:value-of>
    </xsl:template>
</xsl:stylesheet>   
like image 821
Alex Avatar asked May 15 '26 23:05

Alex


1 Answers

This is as per the W3C specification where it states...

Within the body of a stylesheet function, the focus is initially undefined; this means that any attempt to reference the context item, context position, or context size is a non-recoverable dynamic error.

The solution is to pass in a node (such as the root node) as a parameter

<xsl:function name="foo:get-prefered">
   <xsl:param name="root"/> 
   <xsl:param name="field-name"/> 
   <xsl:variable name="var1" select="$root/sources/source[@type='A']/name"></xsl:variable>
   <xsl:value-of select="$var1" />
</xsl:function>

<xsl:template match="/">
    <xsl:value-of select="foo:get-prefered(/, 10)"></xsl:value-of>
</xsl:template>

Alternatively, you could consider using a named-template instead of a function, perhaps:

<xsl:template name="get-prefered">
   <xsl:param name="field-name"/> 
   <xsl:variable name="var1" select="sources/source[@type='A']/name"></xsl:variable>
   <xsl:value-of select="$var1" />
 </xsl:template>

 <xsl:template match="/">
    <xsl:call-template name="get-prefered">
        <xsl:with-param name="field-name">10</xsl:with-param>
    </xsl:call-template>
 </xsl:template>
like image 140
Tim C Avatar answered May 19 '26 03:05

Tim C



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!