======XPath Extensions====== With Version 0.1.0.0 an XPath extension is available in xmlsh which allows calling into xmlsh from with any xpath context including xpath, xlst, xquery, and the builtin <[ ... ]> commands. The namespace "xmlsh" is **predeclared** for the XML expression syntax <[ ... ]> as well as the [[CommandXQuery xquery]], [[CommandXPath xpath]] and [[CommandXslt xslt]] commands. For example, the following works without using an explicit declaration %% echo <[ /xmlsh:eval("xcat") ]> %% Similary the syntax to xquery is supported %% xquery -n -q 'xmls:eval("echo hi")' %% ====Extension functions implemented==== ===eval=== The **eval** xpath function evaluates its first argument as an xmlsh string (identical to the [[CommandEval eval]] command) and optionally its second argument as positional parameters. The return value of the eval function is the standard output of the command. Examples %% xecho <[ xmlsh:eval("xecho $*" , ("foo" , , 1 ) ) ]> xquery -n 'xmlsh:eval("xls")' xpath -n 'xmlsh:eval("xls $*" , "*.xml")' var=<[ xmlsh:eval("xls") ]> %% ===Calling XSLT from XQuery. === An interesting use of eval is to call xslt from within xquery or visa-versa. The context is passed to eval as the stdin and the output of the command becomes the result value of the expression. These examples are in xquery either via the <[ ]> syntax or the [[CommandXquery xquery]] command and require calling xquery from xmlsh to activate the extension function. Example, in an XQuery expression, or file run from xmlsh %% /foo/bar/xmlsh:eval("xslt -f style.xsl")/spam %% calls "xslt" with the sytlesheet "style.xsl" passing the input context from /foo/bar as the input and then the output is further evaluated to extract the /spam child An alternative of the above which can use variables for the stylesheet %% let $style := "style.xsl" return /foo/bar/xmlsh:eval("xslt" , ("-f" , $style) )/spam %% An alternative which passes the input context as a third argument %% let $style := "style.xsl" return xmlsh:eval("xslt" , ("-f" , $style), /foo/bar )/spam %%