Calling .NET Instance-Level Methods
            Instance-level methods (that is, non-static methods) are called by
        supplying an extra first argument of type external .NET object which is the
        object on which the method is to be invoked. An external .NET Object may be created by
        calling an extension function (e.g. a constructor) that returns an object; it may also be
        passed to the query or stylesheet as the value of a global parameter. Matching of method
        names is done as for static methods. If there are several methods in the class that match
        the localname, the system again tries to find the one that is the best fit, according to the
        types of the supplied arguments.
For example, the following XSLT stylesheet prints the operating system name and version.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template name="main"> <out xmlns:env="clitype:System.Environment" xmlns:os="clitype:System.OperatingSystem"> <xsl:variable name="os" select="env:OSVersion()"/> <v platform="{os:Platform($os)}" version="{os:Version($os)}"/> </out> </xsl:template> </xsl:stylesheet>The equivalent in XQuery is:
declare namespace env="clitype:System.Environment"; declare namespace os="clitype:System.OperatingSystem"; let $os := env:OSVersion() return <v platform="{os:Platform($os)}" version="{os:Version($os)}"/>As with static methods, an instance-level .NET method called as an extension function may
        have an extra first argument of class net.sf.saxon.expr.XPathContext. This argument is
        not supplied by the calling XPath or XQuery code, but by Saxon itself. The
          XPathContext object provides methods to access many internal Saxon resources,
        the most useful being getContextItem() which returns the context item from the
        dynamic context.
If any exceptions are thrown by the method, or if a matching method cannot be found,
        processing of the stylesheet will be abandoned. If the tracing option -TJ has been set on
        the command line, a full stack trace will be output. The exception will be wrapped in a
          TransformerException and passed to any user-specified
          ErrorListener object, so the ErrorListener can also produce
        extra diagnostics.