Wiki

Clone wiki

ns-xml / xsh / Examples

XSH Examples

Functions definition

XSH source

<?xml version="1.0" encoding="UTF-8"?>
<xsh:functions xmlns:xsh="http://xsd.nore.fr/xsh">
	<xsh:function name="ns_realpath">
		<xsh:parameter name="path" />
		<xsh:body>
		<xsh:local name="cwd">$(pwd)</xsh:local>
		<![CDATA[
[ -d "${path}" ] && cd "${path}" && path="."
while [ -h "${path}" ] ; do path="$(readlink "${path}")"; done

if [ -d "${path}" ]
then
	path="$( cd -P "$( dirname "${path}" )" && pwd )"
else
	path="$( cd -P "$( dirname "${path}" )" && pwd )/$(basename "${path}")"
fi

cd "${cwd}" 1>/dev/null 2>&1
echo "${path}"
		]]></xsh:body>
	</xsh:function>
</xsh:functions>

Bash output

xsltproc ${NS_XML}/ns/xsl/languages/xsh.xsl examples.xsh
ns_realpath()
{
	local path
	if [ $# -gt 0 ]
	then
		path="${1}"
		shift
	fi
	local cwd="$(pwd)"
	[ -d "${path}" ] && cd "${path}" && path="."
	while [ -h "${path}" ] ; do path="$(readlink "${path}")"; done
	
	if [ -d "${path}" ]
	then
		path="$( cd -P "$( dirname "${path}" )" && pwd )"
	else
		path="$( cd -P "$( dirname "${path}" )" && pwd )/$(basename "${path}")"
	fi
	
	cd "${cwd}" 1>/dev/null 2>&1
	echo "${path}"
}

Ksh output

xsltproc --stringparam xsh.defaultInterpreterType ksh ${NS_XML}/ns/xsl/languages/xsh.xsl examples.xsh
function ns_realpath
{
	typeset var path
	if [ $# -gt 0 ]
	then
		path="${1}"
		shift
	fi
	typeset var cwd="$(pwd)"
	[ -d "${path}" ] && cd "${path}" && path="."
	while [ -h "${path}" ] ; do path="$(readlink "${path}")"; done
	
	if [ -d "${path}" ]
	then
		path="$( cd -P "$( dirname "${path}" )" && pwd )"
	else
		path="$( cd -P "$( dirname "${path}" )" && pwd )/$(basename "${path}")"
	fi
	
	cd "${cwd}" 1>/dev/null 2>&1
	echo "${path}"
}

A simple program

<?xml version="1.0" encoding="UTF-8"?>
<!-- Interpreter type can be forced through the @interpreterType attribute -->
<xsh:program interpreterType="bash" xmlns:xsh="http://xsd.nore.fr/xsh">
	<xsh:functions>
		<!-- This will include ns_realpath function definition --> 
		<xi:include href="relativepath/to/filesystem.xsh" 
			xpointer="xmlns(xsh=http://xsd.nore.fr/xsh) xpointer(//xsh:function[@name = 'ns_realpath'])" />
	</xsh:functions>
	<!-- The program body -->
	<xsh:code><![CDATA[
scriptFilePath="$(ns_realpath "${0}")"
echo "Hello from ${scriptFilePath}" 
	]]></xsh:code>
</xsh:program>

Adding program interface definition

Here is the content of the XSH file for the apps/build-shellscript tool

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright © 2011-2012 by Renaud Guillard (dev@nore.fr) -->
<!-- Distributed under the terms of the MIT License, see LICENSE -->
<xsh:program interpreterType="bash" 
		xmlns:prg="http://xsd.nore.fr/program" 
		xmlns:xsh="http://xsd.nore.fr/xsh" 
		xmlns:xi="http://www.w3.org/2001/XInclude">
	<xsh:info>
		<!-- The program interface XML definition file -->
		<xi:include href="build-shellscript.xml" />
	</xsh:info>
	<xsh:functions>
		<xi:include href="../lib/filesystem/filesystem.xsh" xpointer="xmlns(xsh=http://xsd.nore.fr/xsh) xpointer(//xsh:function[@name = 'ns_realpath'])" />
		<xi:include href="functions.xsh" xpointer="xmlns(xsh=http://xsd.nore.fr/xsh) xpointer(//xsh:function)" />
	</xsh:functions>
	<xsh:code>
		<!-- We can use XInclude here too -->
		<xi:include href="build-shellscript.body.init.sh" parse="text"/>
		<xi:include href="build-shellscript.body.process.sh" parse="text"/>
	</xsh:code>
</xsh:program>

Note that the build-shellscript.body.process.sh code is also included into a function defined in the build-xulapp utility


XML shell file overview

Updated