<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head profile="http://internetalchemy.org/2003/02/profile"> <link rel="foaf" type="application/rdf+xml" title="FOAF" href="http://www.openlinksw.com/dataspace/uda/about.rdf" /> <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" /> <meta name="dc.title" content="Function: xpf_extension - Virtuoso Functions Guide" /> <meta name="dc.subject" content="Function: xpf_extension - Virtuoso Functions Guide" /> <meta name="dc.creator" content="OpenLink Software Documentation Team ; " /> <meta name="dc.copyright" content="OpenLink Software, 1999 - 2009" /> <link rel="top" href="index.html" title="OpenLink Virtuoso Universal Server: Documentation" /> <link rel="search" href="/doc/adv_search.vspx" title="Search OpenLink Virtuoso Universal Server: Documentation" /> <link rel="parent" href="functions.html" title="Chapter Contents" /> <link rel="prev" href="appendixa.html" title="Appendix" /> <link rel="next" href="functions.html#.html" title="" /> <link rel="shortcut icon" href="../images/misc/favicon.ico" type="image/x-icon" /> <link rel="stylesheet" type="text/css" href="doc.css" /> <link rel="stylesheet" type="text/css" href="/doc/translation.css" /> <title>Function: xpf_extension - Virtuoso Functions Guide</title> <meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" /> <meta name="author" content="OpenLink Software Documentation Team ; " /> <meta name="copyright" content="OpenLink Software, 1999 - 2009" /> <meta name="keywords" content="" /> <meta name="GENERATOR" content="OpenLink XSLT Team" /> </head> <body> <div id="header"> <a name="fn_xpf_extension" /> <img src="../images/misc/logo.jpg" alt="" /> <h1>22. Virtuoso Functions Guide - xpf_extension</h1> </div> <div id="navbartop"> <div> <a class="link" href="functions.html">Chapter Contents</a> | <a class="link" href="fn_xper_right_sibling.html" title="XPER navigation">Prev</a> | <a class="link" href="fn_xpf_extension_remove.html" title="xpf_extension_remove">Next</a> </div> </div> <div id="currenttoc"> <form method="post" action="/doc/adv_search.vspx"> <div class="search">Keyword Search: <br /> <input type="text" name="q" /> <input type="submit" name="go" value="Go" /> </div> </form> <div> <a href="http://www.openlinksw.com/">www.openlinksw.com</a> </div> <div> <a href="http://docs.openlinksw.com/">docs.openlinksw.com</a> </div> <br /> <div> <a href="index.html">Book Home</a> </div> <br /> <div> <a href="contents.html">Contents</a> </div> <div> <a href="preface.html">Preface</a> </div> <br /> <div> <a class="selected" href="functions.html">Virtuoso Functions Guide</a> </div> <br /> <div> <a href="functions.html#admin">Administration</a> </div> <div> <a href="functions.html#aggr">Aggregate Functions</a> </div> <div> <a href="functions.html#array">Array Manipulation</a> </div> <div> <a href="functions.html#bpel">BPEL APIs</a> </div> <div> <a href="functions.html#backup">Backup</a> </div> <div> <a href="functions.html#compression">Compression</a> </div> <div> <a href="functions.html#cursors">Cursor</a> </div> <div> <a href="functions.html#time">Date & Time Manipulation</a> </div> <div> <a href="functions.html#debug">Debug</a> </div> <div> <a href="functions.html#dict">Dictionary Manipulation</a> </div> <div> <a href="functions.html#encoding">Encoding & Decoding</a> </div> <div> <a href="functions.html#file">File Manipulation</a> </div> <div> <a href="functions.html#ft">Free Text</a> </div> <div> <a href="functions.html#hash">Hashing / Cryptographic</a> </div> <div> <a href="functions.html#ldap">LDAP</a> </div> <div> <a href="functions.html#localization">Locale</a> </div> <div> <a href="functions.html#mail">Mail</a> </div> <div> <a href="functions.html#misc">Miscellaneous</a> </div> <div> <a href="functions.html#number">Number</a> </div> <div> <a href="functions.html#phrz">Phrases</a> </div> <div> <a href="functions.html#rdf">RDF data</a> </div> <div> <a href="functions.html#rmt">Remote SQL Data Source</a> </div> <div> <a href="functions.html#repl">Replication</a> </div> <div> <a href="functions.html#soap">SOAP</a> </div> <div> <a href="functions.html#sql">SQL</a> </div> <div> <a href="functions.html#string">String</a> </div> <div> <a href="functions.html#txn">Transaction</a> </div> <div> <a href="functions.html#type">Type Mapping</a> </div> <div> <a href="functions.html#uddi">UDDI</a> </div> <div> <a href="functions.html#udt">User Defined Types & The CLR</a> </div> <div> <a href="functions.html#vad">VAD</a> </div> <div> <a href="functions.html#jvmpl">Virtuoso Java PL API</a> </div> <div> <a href="functions.html#bif">Virtuoso Server Extension Interface (VSEI)</a> </div> <div> <a href="functions.html#ws">Web & Internet</a> </div> <div> <a class="selected" href="functions.html#xml">XML</a> </div> <div class="selected"> <div> <a href="fn_XMLAGG.html">xmlagg</a> </div> <div> <a href="fn_XMLATTRIBUTES.html">xmlattributes</a> </div> <div> <a href="fn_XMLAddAttribute.html">xmladdattribute</a> </div> <div> <a href="fn_XMLAppendChildren.html">xmlappendchildren</a> </div> <div> <a href="fn_XMLCONCAT.html">xmlconcat</a> </div> <div> <a href="fn_XMLELEMENT.html">xmlelement</a> </div> <div> <a href="fn_XMLFOREST.html">xmlforest</a> </div> <div> <a href="fn_XMLInsertAfter.html">xmlinsertafter</a> </div> <div> <a href="fn_XMLInsertBefore.html">xmlinsertbefore</a> </div> <div> <a href="fn_XMLReplace.html">xmlreplace</a> </div> <div> <a href="fn_XMLType.XMLType.html">xmltype.xmltype</a> </div> <div> <a href="fn_XMLType.createNonSchemaBasedXML.html">xmltype.createnonsch...</a> </div> <div> <a href="fn_XMLType.createSchemaBasedXML.html">xmltype.createschema...</a> </div> <div> <a href="fn_XMLType.createXML.html">xmltype.createxml</a> </div> <div> <a href="fn_XMLType.existsNode.html">xmltype.existsnode</a> </div> <div> <a href="fn_XMLType.extract.html">xmltype.extract</a> </div> <div> <a href="fn_XMLType.getClobVal.html">xmltype.getclobval</a> </div> <div> <a href="fn_XMLType.getNamespace.html">xmltype.getnamespace</a> </div> <div> <a href="fn_XMLType.getNumVal.html">xmltype.getnumval</a> </div> <div> <a href="fn_XMLType.getRootElement.html">xmltype.getrooteleme...</a> </div> <div> <a href="fn_XMLType.getSchemaURL.html">xmltype.getschemaurl</a> </div> <div> <a href="fn_XMLType.getStringVal.html">xmltype.getstringval</a> </div> <div> <a href="fn_XMLType.isFragment.html">xmltype.isfragment</a> </div> <div> <a href="fn_XMLType.isSchemaBased.html">xmltype.isschemabase...</a> </div> <div> <a href="fn_XMLType.isSchemaValid.html">xmltype.isschemavali...</a> </div> <div> <a href="fn_XMLType.isSchemaValidated.html">xmltype.isschemavali...</a> </div> <div> <a href="fn_XMLType.schemaValidate.html">xmltype.schemavalida...</a> </div> <div> <a href="fn_XMLType.setSchemaValidated.html">xmltype.setschemaval...</a> </div> <div> <a href="fn_XMLType.toObject.html">xmltype.toobject</a> </div> <div> <a href="fn_XMLType.transform.html">xmltype.transform</a> </div> <div> <a href="fn_XMLUpdate.html">xmlupdate</a> </div> <div> <a href="fn_xper_right_sibling.html">xper navigation</a> </div> <div> <a href="fn_createXML.html">createxml</a> </div> <div> <a href="fn_isentity.html">isentity</a> </div> <div> <a href="fn_serialize_to_UTF8_xml.html">serialize_to_utf8_xm...</a> </div> <div> <a href="fn_tidy_html.html">tidy_html</a> </div> <div> <a href="fn_tidy_list_errors.html">tidy_list_errors</a> </div> <div> <a href="fn_updateXML.html">updatexml</a> </div> <div> <a href="fn_xml_add_system_path.html">xml_add_system_path</a> </div> <div> <a href="fn_xml_auto.html">xml_auto</a> </div> <div> <a href="fn_xml_auto_dtd.html">xml_auto_dtd</a> </div> <div> <a href="fn_xml_auto_schema.html">xml_auto_schema</a> </div> <div> <a href="fn_xml_create_tables_from_mapping_schema_decl.html">xml_create_tables_fr...</a> </div> <div> <a href="fn_xml_cut.html">xml_cut</a> </div> <div> <a href="fn_xml_doc_output_option.html">xml_doc_output_optio...</a> </div> <div> <a href="fn_xml_get_system_paths.html">xml_get_system_paths</a> </div> <div> <a href="fn_xml_load_mapping_schema_decl.html">xml_load_mapping_sch...</a> </div> <div> <a href="fn_xml_load_schema_decl.html">xml_load_schema_decl</a> </div> <div> <a href="fn_xml_namespace_scope.html">xml_namespace_scope</a> </div> <div> <a href="fn_xml_persistent.html">xml_persistent</a> </div> <div> <a href="fn_xml_set_ns_decl.html">xml_set_ns_decl</a> </div> <div> <a href="fn_xml_template.html">xml_template</a> </div> <div> <a href="fn_xml_tree.html">xml_tree</a> </div> <div> <a href="fn_xml_tree_doc.html">xml_tree_doc</a> </div> <div> <a href="fn_xml_tree_doc_media_type.html">xml_tree_doc_media_t...</a> </div> <div> <a href="fn_xml_uri_get.html">xml_uri_get</a> </div> <div> <a href="fn_xml_validate_dtd.html">xml_validate_dtd</a> </div> <div> <a href="fn_xml_validate_schema.html">xml_validate_schema</a> </div> <div> <a href="fn_xml_view_dtd.html">xml_view_dtd</a> </div> <div> <a href="fn_xml_view_schema.html">xml_view_schema</a> </div> <div> <a href="fn_xmlsql_update.html">xmlsql_update</a> </div> <div> <a href="fn_xpath_eval.html">xpath_eval</a> </div> <div> <a href="fn_xper_cut.html">xper_cut</a> </div> <div> <a href="fn_xper_doc.html">xper_doc</a> </div> <div> <a href="fn_xper_locate_words.html">xper_locate_words</a> </div> <div> <a class="selected" href="fn_xpf_extension.html">xpf_extension</a> </div> <div> <a href="fn_xpf_extension_remove.html">xpf_extension_remove</a> </div> <div> <a href="fn_xquery_eval.html">xquery_eval</a> </div> <div> <a href="fn_xslt.html">xslt</a> </div> <div> <a href="fn_xslt_format_number.html">xslt_format_number</a> </div> <div> <a href="fn_xslt_sheet.html">xslt_sheet</a> </div> <div> <a href="fn_xslt_stale.html">xslt_stale</a> </div> <div> <a href="fn_xte_head.html">xte_head</a> </div> <div> <a href="fn_xte_node.html">xte_node</a> </div> <div> <a href="fn_xte_node_from_nodebld.html">xte_node_from_nodebl...</a> </div> <div> <a href="fn_xte_nodebld_acc.html">xte_nodebld_acc</a> </div> <div> <a href="fn_xte_nodebld_final.html">xte_nodebld_final</a> </div> <div> <a href="fn_xte_nodebld_init.html">xte_nodebld_init</a> </div> <div> <a href="fn_xtree_doc.html">xtree_doc</a> </div> </div> <div> <a href="functions.html#XPATH">XPATH & XQUERY</a> </div> <br /> <div> <a href="functionidx.html">Functions Index</a> </div> <br /> </div> <div id="text"> <h2>xpf_extension</h2> <div class="refpurpose">declare an XPath extension function </div> <div class="funcsynopsis"> <span class="funcdef">void <span class="function">xpf_extension</span> </span> (<span class="paramdef">in <span class="parameter">fname</span> varchar</span>, <span class="paramdef">in <span class="parameter">procedure_name</span> varchar</span>); </div> <div class="refsect1"> <div class="refsect1title">Description</div> <p> This function is used to declare a new XPath extension function or redefine an existing function. It can be used in XPath queries and XSLT stylesheets. You should use QNames for extension functions. Note that the standard XPath functions cannot be redefined.</p> <p> <span class="computeroutput">xpf_extension()</span> stores the functions into the SYS_XPF_EXTENSIONS system table. </p> <div> <pre class="programlisting"> CREATE TABLE DB.DBA.SYS_XPF_EXTENSIONS ( XPE_NAME VARCHAR PRIMARY KEY, XPE_PNAME VARCHAR ) </pre> </div> <p> The input parameters will be retrieved as a strings and then will be converted to the datatype of the corresponding argument of the stored procedure. </p> </div> <div class="refsect1"> <div class="refsect1title">Parameters</div> <div class="refsect2"> <span class="refsect2title">fname – </span> The name of the extension function, which must be the expanded QName of the extension function</div> <div class="refsect2"> <span class="refsect2title">procedure_name – </span> The fully qualified name of the PL procedure which acts as the extension function. The procedure in question must be granted to PUBLIC, otherwise it will not be registered and error will be signalled. </div> </div> <div class="refsect1"> <div class="refsect1title">Return Types</div> <p>None (void).</p> </div> <div class="refsect1title">Errors</div> <table class="data"> <tr> <th class="data">SQLState</th> <th class="data">Error Code</th> <th class="data">Error Text</th> <th class="data">Description</th> </tr> <tr> <td class="data"> <a name="err42001" /> <span class="errorcode">42001</span> </td> <td class="data"> <a name="errXPE01" /> <span class="errorcode">XPE01</span> </td> <td class="data"> <span class="errorname">The function <procedure_name> does not exists</span> </td> <td class="data">if procedure to define as a XPATH extension function is not existing one.</td> </tr> <tr> <td class="data"> <a name="err42001" /> <span class="errorcode">42001</span> </td> <td class="data"> <a name="errXPE02" /> <span class="errorcode">XPE02</span> </td> <td class="data"> <span class="errorname">The <built-in XPATH|XQUERY> function "<func name>" cannot be re-defined</span> </td> <td class="data">if XPATH or XQUERY function to be registered is a core function.</td> </tr> </table> <br /> <p /> <div class="refsect1"> <div class="refsect1title">Examples</div> <a name="ex_xpf_extension" /> <div class="example"> <div class="exampletitle">Declaring a New XSLT Function</div> <p>First define a PL procedure, then declare an XPath extension function and to represent it.</p> <div> <pre class="programlisting"> SQL> create procedure DB.DBA.str_concat (in a varchar, in b varchar) { return concat (a, ':', b); }; SQL> xpf_extension ('http://www.openlinksw.com/virtuoso/xslt:concat_strings', 'DB.DBA.str_concat'); </pre> </div> <p> The source of the ([http_root]/ext.xsl) XSLT stylesheet </p> <div> <pre class="programlisting"> <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns:virt="http://www.openlinksw.com/virtuoso/xslt"> <xsl:template match="/doc"> <HTML> <BODY> <xsl:if test="function-available('virt:concat_strings')"> <xsl:value-of select="virt:concat_strings ('foo', 'bar')"/> </xsl:if> </BODY> </HTML> </xsl:template> </xsl:stylesheet> </pre> </div> <p>The source of the <span class="computeroutput">([http_root]/ext.vsp)</span> VSP page: </p> <div> <pre class="programlisting"> <?vsp http_xslt ('file:/ext.xsl'); ?> <doc> <a/> </doc> </pre> </div> <p> This will produce the following HTML page: </p> <div> <pre class="programlisting"> <HTML><BODY>foo:bar</BODY></HTML> </pre> </div> <p>Using the definition of the XPath extension function, we can include it in XPath expressions.</p> <div> <pre class="programlisting"> SQL> select p from ws..sys_dav_res where xpath_contains (RES_CONTENT, '[xmlns:virt=''http://www.openlinksw.com/virtuoso/xslt''] virt:concat_strings (''Title '', string(/chapter/title))', p); </pre> </div> <p>This will return the contents of any '/chapter/title' nodes, prefixed with constant string 'Title'.</p> </div> </div> <div class="refsect1"> <div class="refsect1title">See Also</div> <p> <a href="fn_xpf_extension_remove.html">xpf_extension_remove</a> </p> </div> </div> <div id="footer"> <div>Copyright© 1999 - 2009 OpenLink Software All rights reserved.</div> <div id="validation"> <a href="http://validator.w3.org/check/referer"> <img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /> </a> <a href="http://jigsaw.w3.org/css-validator/"> <img src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" height="31" width="88" /> </a> </div> </div> </body> </html>