XSH Reference


Table of Contents

1. XSH Language
1.1. Files/Documents
1.2. Tree navigation
1.3. Tree modification
1.4. Flow control
1.5. Retrieving more information
1.6. Argument Types
1.7. Variables
1.8. Options
1.9. Interacting with Perl and Shell
2. Command Reference
2.1. assign
2.2. backups
2.3. call
2.4. catalog
2.5. cd
2.6. clone
2.7. close
2.8. copy
2.9. count
2.10. create
2.11. debug
2.12. def
2.13. defs
2.14. doc-info
2.15. documents
2.16. dtd
2.17. empty-tags
2.18. enc
2.19. encoding
2.20. exec
2.21. exit
2.22. fold
2.23. foreach
2.24. help
2.25. if
2.26. ifinclude
2.27. include
2.28. indent
2.29. insert
2.30. iterate
2.31. keep-blanks
2.32. last
2.33. lcd
2.34. load-ext-dtd
2.35. local
2.36. locate
2.37. ls
2.38. map
2.39. move
2.40. namespaces
2.41. next
2.42. nobackups
2.43. nodebug
2.44. normalize
2.45. open
2.46. options
2.47. parser-completes-attributes
2.48. parser-expands-entities
2.49. parser-expands-xinclude
2.50. pedantic-parser
2.51. perl
2.52. prev
2.53. print
2.54. process-xinclude
2.55. pwd
2.56. query-encoding
2.57. quiet
2.58. recovering
2.59. redo
2.60. register-function
2.61. register-namespace
2.62. register-xhtml-namespace
2.63. register-xsh-namespace
2.64. remove
2.65. rename
2.66. return
2.67. run-mode
2.68. save
2.69. select
2.70. set-enc
2.71. set-standalone
2.72. skip-dtd
2.73. sort
2.74. stream
2.75. strip-whitespace
2.76. switch-to-new-documents
2.77. test-mode
2.78. throw
2.79. try
2.80. undef
2.81. unfold
2.82. unless
2.83. unregister-function
2.84. unregister-namespace
2.85. valid
2.86. validate
2.87. validation
2.88. variables
2.89. verbose
2.90. version
2.91. while
2.92. xcopy
2.93. xinsert
2.94. xmove
2.95. xpath-axis-completion
2.96. xpath-completion
2.97. xslt
2.98. xupdate
3. Type Reference
3.1. filename
3.2. xPath
3.3. command-block
3.4. enc_string
3.5. expression
3.6. id
3.7. location
3.8. node-type
3.9. perl-code

1. XSH Language

XSH acts as a command interpreter. Individual commands must be separated with a semicolon. Each command may be followed by a pipeline redirection to capture the command's output. In the interactive shell, backslash may be used at the end of line to indicate that the command follows on the next line.

A pipeline redirections may be used either to feed the command's output to a unix command or to store it in a XSH string variable.

In the first case, the syntax is xsh-command | shell-command ; where xsh-command is any XSH command and shell-command is any command (or code) recognized by the default shell interpreter of the operating system (i.e. on UNIX systems by sh or csh, on Windows systems by cmd). Brackets may be used to join more shell commands (may depend on which shell is used).

Example 1. Count attributes of words containing string foo in its name or value.

xsh> ls //words/@* | grep foo | wc

In order to store a command's output in a string variable, the pipeline redirection must take the form xsh-command |> $variable where xsh-command is any XSH command and $variable is any valid name for a string variable.

Example 2. Store the number of all words in a variable named count.

xsh> count //words |> $count

help command gives a list of all XSH commands.

help type gives a list of all argument types.

help followed by a command or type name gives more information on the particular command or argument type.

1.1. Files/Documents

XSH is intended to query and manipulate XML and HTML documents. Use one of the open/open-*/create commands to load an XML or HTML document from a local file, external URL (such as http:// or ftp://), string or pipe. While loading, XSH parses and optionally validates (see validation and load-ext-dtd) the document. Parsed documents are stored in memory as DOM trees, that can be navigated and manipulated quite similarly to a local filesystem.

Every opened document is associated with an identifier (id), that is a symbolic name for the document in XSH and can be used for example as a prefix of xpath.

In the current version, XSH is only able to save documents locally. To store a document on any other location, use ls command and pipe redirection to feed the XML representation of the document to any external program that is able to store it on a remote location.

Example 3. Store XSH document DOC on a remote machine using Secure Shell

xsh> ls DOC:/ | ssh my.remote.org 'cat > test.xml'

1.1.1. Related Argument Types and Commands

backups

turn on backup file creation

catalog

use a catalog file during all parsing processes

clone

clone a given document

close

close document (do not save it, though)

create

make a new document from a given XML fragment

documents

display a list of open files

filename

file name

id

identifier

nobackups

turn off backup file creation

open

load an XML, HTML, or Docbook SGML document from a file, pipe or URI

process-xinclude

load and insert XInclude sections

save

save a document as XML or HTML

select

make a given document the current one

stream

process selected elements from an XML stream (EXPERIMENTAL)

switch-to-new-documents

set on/off changing current document to newly open/created files

1.2. Tree navigation

With XSH, it is possible to browse document trees as if they were a local filesystem, except that XPath expressions are used instead of ordinary UNIX paths.

Current position in the document tree is called the current node. Current node's XPath may be queried with pwd command. In the interactive shell, current node is also displayed in the command line prompt. Remember, that beside cd command, current node (and document) is silently changed by all variant of open command, create command and temporarily also by the node-list variant of the foreach statement.

Documents are specified in a similar way as harddrives on DOS/Windows(TM) systems (except that their names are not limitted to one letter in XSH), i.e. by a prefix of the form doc: where doc is the id associated with the document.

To mimic the filesystem navigation as closely as possible, XSH contains several commands named by analogy of UNIX filesystem commands, such as cd, ls and pwd.

xsh scratch:/> open docA="testA.xml"
xsh docB:/> open docB="testB.xml"
xsh> pwd
docB:/
xsh docB:/> cd docA:/article/chapter[title='Conclusion']
xsh docA:/article/chapter[5]> pwd
docA:/article/chapter[5]
xsh docA:/article/chapter[5]> cd previous-sibling::chapter
xsh docA:/article/chapter[4]> cd ..
xsh docA:/article> select docB
xsh docB:/>

1.2.1. Related Argument Types and Commands

cd

change current context node

fold

mark elements to be folded by list command

locate

show a given node location (as a cannonical XPath)

ls

list a given part of a document as XML

pwd

show current context node location (as a cannonical XPath)

register-function

define XPath extension function (EXPERIMENTAL)

register-namespace

register namespace prefix to use XPath expressions

register-xhtml-namespace

register XHTML namespace prefix to use XPath expressions

register-xsh-namespace

register XSH namespace prefix to use XPath expressions

select

make a given document the current one

unfold

unfold elements folded with fold command

unregister-function

undefine extension function (EXPERIMENTAL)

unregister-namespace

unregister namespace prefix

xpath

XPath expression

1.3. Tree modification

XSH provides mechanisms not only to browse and inspect the DOM tree but also to modify its content by providing commands for copying, moving, and deleting its nodes as well as adding completely new nodes or XML fragments to it. It is quite easy to learn these commands since their names or aliases mimic their well-known filesystem analogies. On the other hand, many of these commands have two versions one of which is prefixed with a letter "x". This "x" stands for "cross", thus e.g. xcopy should be read as "cross copy". Let's explain the difference on the example of xcopy.

When you copy, you have to specify what are you copying and where are you copying to, so you have to specify the source and the target. XSH is very much XPath-based so, XPath is used here to specify both of them. However, there might be more than one node that satisfies an XPath expression. So, the rule of thumb is that the "cross" variant of a command places one and every of the source nodes to the location of one and every destination node, while the plain variant works one-by-one, placing the first source node to the first destination, the second source node to the second destination, and so on (as long as there are both source nodes and destinations left).

xsh> create a "<X><A/><Y/><A/></X>";
xsh> create b "<X><B/><C/><B/><C/><B/></X>";
xsh> xcopy a://A replace b://B;
xsh> copy b://C before a://A;
xsh> ls a:/;
<?xml version="1.0" encoding="utf-8"?>
<X><C/><A/><Y/><C/><A/></X>

xsh> ls b:/;
<?xml version="1.0" encoding="utf-8"?>
<X><A/><A/><C/><A/><A/><C/><A/><A/></X>

As already indicated by the example, another issue of tree modification is the way in which the destination node determines the target location. Should the source node be placed before, after, or into the resulting node? Should it replace it completely? This information has to be given in the location argument that usually precedes the destination XPath.

Now, what happens if source and destination nodes are of incompatible types? XSH tries to avoid this by implicitly converting between node types when necessary. For example, if a text, comment, and attribute node is copied into, before or after an attribute node, the original value of the attribute is replaced, prepended or appended respectively with the textual content of the source node. Note however, that element nodes are never converted into text, attribute or any other textual node. There are many combinations here, so try yourself and see the results.

You may even use some more sofisticated way to convert between node types, as shown in the following example, where an element is first commented out and than again uncommented. Note, that the particular approach used for resurrecting the commented XML material works only for well-balanced chunks of XML.

Example 4. Using string variables to convert between different types of nodes

create doc <<EOF;
<?xml version='1.0'?>
<book>
  <chapter>
    <title>Intro</title>
  </chapter>
  <chapter>
    <title>Rest</title>
  </chapter>
</book>
EOF


# comment out the first chapter
ls //chapter[1] |> $chapter_xml;
add comment $chapter_xml replace //chapter[1];
ls / 0;
# OUTPUT:
<?xml version="1.0"?>
<book>
<!--  <chapter>
    <title>Intro</title>
  </chapter>
-->
  <chapter>
    <title>Rest</title>
  </chapter>
</book>


# un-comment the chapter
$comment = string(//comment()[1]);
add chunk $comment replace //comment()[1];
ls / 0;
# OUTPUT:
<?xml version="1.0"?>
<book>
  <chapter>
    <title>Intro</title>
  </chapter>

  <chapter>
    <title>Rest</title>
  </chapter>
</book>

1.3.1. Related Argument Types and Commands

clone

clone a given document

copy

copy nodes (in the one-to-one mode)

expression

string-like expression

insert

create a node in on a given target location

location

relative destination specification (such as after, before, etc.)

map

quickly modify node value/data using Perl code

move

move nodes (in the one-to-one mode)

node-type

node type specification (such as element, attribute, etc.)

normalize

normalizes adjacent textnodes

process-xinclude

load and insert XInclude sections

remove

remove given nodes

rename

quickly rename nodes with in-line Perl code

set-enc

set document's charset (encoding)

set-standalone

set document's standalone flag

strip-whitespace

strip leading and trailing whitespace

xcopy

copy nodes (in the all-to-every mode)

xinsert

create nodes on all target locations

xmove

move nodes (in the all-to-every mode)

xpath

XPath expression

xslt

transform document with XSLT

xupdate

apply XUpdate commands on a document

1.4. Flow control

What a scripting language XSH would be had it not some kind of conditional statements, loops and other stuff that influences the way in which XSH commands are processed.

Most notable XSH's feature in this area is that some of the basic flow control statements, namely if, unless, while and foreach have two variants, an XPath-based one and a Perl-based one. The XPath-based variant uses xpath expressions to specify the condition or node-lists to iterate, while the other one utilizes perl-code for this purpose. See descriptions of the individual statements for more detail.

1.4.1. Related Argument Types and Commands

call

call user-defined routine (macro)

command-block

single XSH command or a block of XSH commands

def

sub-routine (macro) declaration

exit

exit XSH shell

foreach

loop iterating over a node-list or perl array

if

if statement

ifinclude

conditionally include another XSH source in current position

include

include another XSH source in current position

iterate

iterate a block over current subtree

last

immediately exit an enclosing loop

next

start the next iteration of an enclosing loop

prev

restart an iteration on a previous node

redo

restart the innermost enclosing loop block

return

return from a subroutine

run-mode

switch into normal execution mode (quit test-mode)

stream

process selected elements from an XML stream (EXPERIMENTAL)

test-mode

do not execute any command, only check the syntax

throw

throw an exception

try

try/catch statement

undef

undefine sub-routine (macro)

unless

negated if statement

while

simple while loop

1.5. Retrieving more information

Beside the possibility to browse the DOM tree and list some parts of it (as described in Navigation), XSH provides commands to obtain other information related to open documents as well as the XSH interpreter itself. These commands are listed bellow.

1.5.1. Related Commands

count

calculate a given XPath expression and enumerate node-lists

defs

list all user-defined routines (macros)

doc-info

displays various information about a document

documents

display a list of open files

dtd

show document's DTD

enc

show document's original character encoding

help

on-line documentation

locate

show a given node location (as a cannonical XPath)

ls

list a given part of a document as XML

namespaces

List namespaces in current scope (or in scope of given nodes)

options

list current settings using XSH syntax

print

print given stuff on standard console output

pwd

show current context node location (as a cannonical XPath)

valid

check if the document is valid (according to a DTD, RelaxNG, or XSD schemas)

validate

validate a document against a DTD, RelaxNG, or XSD schemas

variables

display a list of defined variables

version

show version information

1.6. Argument Types

XSH commands accept different types of arguments, such as usual strings (expression) or XPath expressions. Notably, these two types and types based on them support string variable interpolation. See documentation of the individual types for more information.

1.6.1. Related Argument Types

command-block

single XSH command or a block of XSH commands

enc-string

character encoding (codepage) identifier

expression

string-like expression

filename

file name

id

identifier

location

relative destination specification (such as after, before, etc.)

node-type

node type specification (such as element, attribute, etc.)

perl-code

in-line code in Perl programming language

xpath

XPath expression

1.7. Variables

In the current version, XSH supports two types of variables: string (scalar) variables and node-list variables. Perl programmers that might miss some other kinds of variables (arrays or hashes) may use the support for interacting with Perl to access these types (see some examples below).

These two kinds of variables differ syntactically in the prefix: string variables are prefixed with a dollar sign ($) while node-list variables are prefixed with a percent sign (%).

1.7.1. String Variables

Every string variable name consists of a dollar sign ($) prefix and an id, that has to be unique among other scalar variables, e.g. $variable. Values are assigned to variables either by simple assignments of the form $variable = xpath or by capturing the output of some command with a variable redirection of the form command |> $variable.

String variables may be used in string expressions, XPath expressions, or even in perl-code as $id or ${id}. In the first two cases, variables act as macros in the sense that all variables occurences are replaced by the corresponding values before the expression itself is evaluated.

To display current value of a variable, use the print command, variables command or simply the variable name:

xsh> $b="chapter";
xsh> $file="${b}s.xml";
xsh> open f=$file;
xsh> ls //$b[count(descendant::para)>10]
xsh> print $b
chapter
xsh> $b
$b='chapter';
xsh> variables
$a='chapters.xml';
$b='chapter';

1.7.2. Node-list Variables

Every string variable name consists of a percent sign (%) prefix and an id, that has to be unique among other node-list variables, e.g. %variable.

Node-list variables can be used to store lists of nodes that result from evaluating an XPath. This is especially useful when several changes are performed on some set of nodes and evaluating the XPath expression repeatedly would take too long. Other important use is to remember a node that would otherwise be extremely hard or even impossible to locate by XPath expressions after some changes to the tree structure are made, since such an XPath cannot be predicted in advance.

Although node-list variables act just like XPath expressions that would result in the same node-list, for implementation reasons it is not possible to use node-list variables as parts of complex XPath expressions except for one case. They may be only used at the very beginning of an XPath expression. So while constructions such as %creatures[4], %creatures[@race='elf'], or %creatures/parents/father do work as expected, string(%creatures[2]/@name) //creature[%creatures[2]/@name=@name], or %creatures[@race='elf'][2] do not. In the first two cases it is because node-list variables cannot be evaluated in the middle of an XPath expression. The third case fails because this construction actually translates into a sequence of evaluations of self::*[@race='elf'][2] for each node in the %creatures node-list, which is not equivallent to the intended expression as the [2] filter does not apply to the whole result of %creatures[@race='elf'] at once but rather to the partial results.

Fortunatelly, it is usually possible to work around these unsupported constructions quite easily. This is typically done by introducing some more variables as well as using the foreach statement. The following example should provide some idea on how to do this:

# work around for $name=string(%creatures[2]/@name)
xsh> foreach %creatures[2] $name=string(@name)
# work around for ls //creature[%creatures[2]/@name=@name]
xsh> ls //creature[$name=@name]
# work around for ls %creatures[@race='elf'][2]
xsh> %elves = %creatures[@race='elf']
xsh> ls %elves[2]

Remember, that when a node is deleted from a tree it is at the same time removed from all node-lists it occurs in. Note also, that unlike string variables, node-list variables can not be (and are not intended to be) directly accessed from Perl code.

1.7.3. Accessing Perl Variables

All XSH string variables are usual Perl scalar variables from the XML::XSH::Map namespace, which is the default namespace for any Perl code evaluated from XSH. Thus it is possible to arbitrarily intermix XSH and Perl assignments:

xsh> ls //chapter[1]/title
<title>Introduction</title>
xsh> $a=string(//chapter[1]/title)
xsh> eval { $b="CHAPTER 1: ".uc($a); }
xsh> print $b
CHAPTER 1: INTRODUCTION

If needed, it is, however, possible to use any other type of Perl variables by means of evaluating a corresponding perl code. The following example demonstrates using Perl hashes to collect and print some simple racial statistics about the population of Middle-Earth:

foreach a:/middle-earth/creature { 
  $race=string(@race);
  eval { $races{$race}++ };
}
print "Middle-Earth Population (race/number of creatures)"
eval { 
  echo map "$_/$races{$_}\n",
    sort ($a cmp $b), keys(%races); 
};

1.7.4. Related Argument Types and Commands

assign

variable assignment

expression

string-like expression

id

identifier

local

temporarily assign new value to a variable

xpath

XPath expression

1.8. Options

The following commands are used to modify the default behaviour of the XML parser or XSH itself. Some of the commands are switch between two different modes according to a given expression (which is expected to result either in zero or non-zero value). Other commands also working as a flip-flop have their own explicit counterpart (e.g. verbose and quiet or debug and nodebug). This misconsistency is due to historical reasons.

The encoding and query-encoding options allow to specify character encoding that should be expected from user as well as the encoding to be used by XSH on output. This is particularly useful when you work with UTF-8 encoded documents on a console which supports only 8-bit characters.

The options command displays current settings by means of XSH commands. Thus it can not only be used to review current values, but also to store them future use, e.g. in ~/.xshrc file.

xsh> options | cat > ~/.xshrc

1.8.1. Related Argument Types and Commands

backups

turn on backup file creation

debug

display many annoying debugging messages

empty-tags

turn on/off serialization of empty tags

enc-string

character encoding (codepage) identifier

encoding

choose output charset

indent

turn on/off pretty-printing

keep-blanks

turn on/off ignorable whitespace preservation

load-ext-dtd

turn on/off external DTD fetching

nobackups

turn off backup file creation

nodebug

turn off debugging messages

options

list current settings using XSH syntax

parser-completes-attributes

turn on/off parser's ability to fill default attribute values

parser-expands-entities

turn on/off parser's tendency to expand entities

parser-expands-xinclude

turn on/off transparent XInclude insertion by parser

pedantic-parser

make the parser more pedantic

query-encoding

declare the charset of XSH source files and terminal input

quiet

turn off many XSH messages

recovering

turn on/off parser's ability to fix broken XML

register-function

define XPath extension function (EXPERIMENTAL)

register-namespace

register namespace prefix to use XPath expressions

register-xhtml-namespace

register XHTML namespace prefix to use XPath expressions

register-xsh-namespace

register XSH namespace prefix to use XPath expressions

run-mode

switch into normal execution mode (quit test-mode)

skip-dtd

turn on/off serialization of DTD DOCTYPE declaration

switch-to-new-documents

set on/off changing current document to newly open/created files

test-mode

do not execute any command, only check the syntax

unregister-function

undefine extension function (EXPERIMENTAL)

unregister-namespace

unregister namespace prefix

validation

turn on/off validation in XML parser

verbose

make XSH print many messages

xpath-axis-completion

sets TAB completion for axes in xpath expressions in the interactive mode

xpath-completion

turn on/off TAB completion for xpath expressions in the interactive mode

1.9. Interacting with Perl and Shell

To allow more complex tasks to be achieved, XSH provides ways for interaction with the Perl programming language and the system shell.

1.9.1. Calling Perl

Perl is a language optimized for scanning arbitrary text files, extracting information from those text files, and printing reports based on that information. It's also a good language for many system management tasks. The language is intended to be practical (easy to use, efficient, and complete). XSH itself is written in Perl, so it is extremely easy to support this language as an extension to XSH.

Perl expressions or blocks of code can either be simply evaluated with the perl command, used to do quick changes to nodes of the DOM tree (see map command), used to provide list of strings to iterate over in a foreach loop, or to specify more complex conditions for if, unless, and while statements.

To prevent conflict between XSH internals and the evaluated perl code, XSH runs such code in the context of a special namespace XML::XSH::Map. As described in the section Variables, XSH string variables may be accessed and possibly assigned from Perl code in the most obvious way, since they actually are Perl variables defined in the XML::XSH::Map namespace.

The interaction between XSH and Perl actually works also the other way round, so that you may call back XSH from the evaluated Perl code. For this, Perl function xsh is defined in the XML::XSH::Map namespace. All parameters passed to this function are interpreted as XSH commands. To simplify evaluation of XPath expressions, another three functions: The first one, named count, returns the same value as would be printed by count command in XSH on the same XPath expression. The second function, named literal, returns the result of XPath evaluation as if the whole expression was wrapped with the XPath string() function. In other words, literal('doc:expression') returns the same value as count('doc:string(expression)'). The third function, named xml_list, returns the result of the XPath search as a XML string which is equivallent to the output of a ls on the same XPath expression (without indentation and without folding or any other limitation on the depth of the listing).

In the following examples we use Perl to populate the Middle-Earth with Hobbits whose names are read from a text file called hobbits.txt, unless there are some Hobbits in Middle-Earth already.

Example 5. Use Perl to read text files

unless (//creature[@race='hobbit']) {
  perl 'open $file, "hobbits.txt"';
  perl '@hobbits=<$file>';
  perl 'close $file';
  foreach { @hobbits } {
    insert element "<creature name='$__' race='hobbit'>"
      into m:/middle-earth/creatures;
  }
}

Example 6. The same code as a single Perl block

perl {
  unless (count(//creature[@race='hobbit'])) {
    open my $file, "hobbits.txt";
    foreach (<$file>) {
      xsh(qq{insert element "<creature name='$_' race='hobbit'>"
        into m:/middle-earth/creatures});
    }
    close $file;
  }
};

1.9.2. Writing your own XPath extension functions in Perl

XSH allows the user to extend the set of XPath functions by providing an extension function written in Perl. This can be achieved using the register-function command. The perl code implementing an extension function works as a usual perl routine accepting its arguments in @_ and returning the result. The following conventions are used:

The arguments passed to the perl implementation by the XPath engine are either simple scalars or XML::LibXML::NodeList objects, depending on the types of the XPath arguments. The implementation is responsible for checking the argument number and types. The implementation may use arbitrary XML::LibXML methods to process the arguments and return the result. (XML::LibXML perl module documentation can be found for example at http://search.cpan.org/author/PHISH/XML-LibXML-1.54/LibXML.pm).

The implementation SHOULD NOT, however, MODIFY the document. Doing so could not only confuse the XPath engine but result in an critical error (such as segmentation fault).

Calling XSH commands from extension function implementations is not currently allowed.

The perl code must return a single value, which can be of one of the following types: a simple scalar (a number or string), XML::LibXML::Boolean object reference (result is a boolean value), XML::LibXML::Literal object reference (result is a string), XML::LibXML::Number object reference (resulat is a float), XML::LibXML::Node (or derived) object reference (result is a nodeset consisting of a single node), or XML::LibXML::NodeList (result is a nodeset). For convenience, simple (non-blessed) array references consisting of XML::LibXML::Node objects can also be used for a nodeset result instead of a XML::LibXML::NodeList.

1.9.3. Calling the System Shell

In the interactive mode, XSH interprets all lines starting with a exclamation mark (!) as shell commands and invokes the system shell to interpret them (this is to mimic FTP command-line interpreters).

xsh> !ls -l
-rw-rw-r--    1 pajas    pajas        6355 Mar 14 17:08 Artistic
drwxrwxr-x    2 pajas    users         128 Sep  1 10:09 CVS
-rw-r--r--    1 pajas    pajas       14859 Aug 26 15:19 ChangeLog
-rw-r--r--    1 pajas    pajas        2220 Mar 14 17:03 INSTALL
-rw-r--r--    1 pajas    pajas       18009 Jul 15 17:35 LICENSE
-rw-rw-r--    1 pajas    pajas         417 May  9 15:16 MANIFEST
-rw-rw-r--    1 pajas    pajas         126 May  9 15:16 MANIFEST.SKIP
-rw-r--r--    1 pajas    pajas       20424 Sep  1 11:04 Makefile
-rw-r--r--    1 pajas    pajas         914 Aug 26 14:32 Makefile.PL
-rw-r--r--    1 pajas    pajas        1910 Mar 14 17:17 README
-rw-r--r--    1 pajas    pajas         438 Aug 27 13:51 TODO
drwxrwxr-x    5 pajas    users         120 Jun 15 10:35 blib
drwxrwxr-x    3 pajas    users        1160 Sep  1 10:09 examples
drwxrwxr-x    4 pajas    users          96 Jun 15 10:35 lib
-rw-rw-r--    1 pajas    pajas           0 Sep  1 16:23 pm_to_blib
drwxrwxr-x    4 pajas    users         584 Sep  1 21:18 src
drwxrwxr-x    3 pajas    users         136 Sep  1 10:09 t
-rw-rw-r--    1 pajas    pajas          50 Jun 16 00:06 test
drwxrwxr-x    3 pajas    users         496 Sep  1 20:18 tools
-rwxr-xr-x    1 pajas    pajas        5104 Aug 30 17:08 xsh

To invoke a system shell command or program from the non-interactive mode or from a complex XSH construction, use the exec command.

Since UNIX shell commands are very powerful tool for processing textual data, XSH supports direct redirection of XSH commands output to system shell command. This is very similarly to the redirection known from UNIX shells, except that here, of course, the first command in the pipe-line colone is an XSH command. Since semicolon (;) is used in XSH to separate commands, it has to be prefixed with a backslash if it should be used for other purposes.

Example 7. Use grep and less to display context of `funny'

xsh> ls //chapter[5]/para | grep funny | less

Example 8. The same on Windows 2000/XP systems

xsh> ls //chapter[5]/para | find "funny" | more

1.9.4. Related Argument Types and Commands

exec

execute a shell command

expression

string-like expression

lcd

change system working directory

map

quickly modify node value/data using Perl code

perl

evaluate in-line Perl code

perl-code

in-line code in Perl programming language

rename

quickly rename nodes with in-line Perl code

2. Command Reference

2.1. assign
2.2. backups
2.3. call
2.4. catalog
2.5. cd
2.6. clone
2.7. close
2.8. copy
2.9. count
2.10. create
2.11. debug
2.12. def
2.13. defs
2.14. doc-info
2.15. documents
2.16. dtd
2.17. empty-tags
2.18. enc
2.19. encoding
2.20. exec
2.21. exit
2.22. fold
2.23. foreach
2.24. help
2.25. if
2.26. ifinclude
2.27. include
2.28. indent
2.29. insert
2.30. iterate
2.31. keep-blanks
2.32. last
2.33. lcd
2.34. load-ext-dtd
2.35. local
2.36. locate
2.37. ls
2.38. map
2.39. move
2.40. namespaces
2.41. next
2.42. nobackups
2.43. nodebug
2.44. normalize
2.45. open
2.46. options
2.47. parser-completes-attributes
2.48. parser-expands-entities
2.49. parser-expands-xinclude
2.50. pedantic-parser
2.51. perl
2.52. prev
2.53. print
2.54. process-xinclude
2.55. pwd
2.56. query-encoding
2.57. quiet
2.58. recovering
2.59. redo
2.60. register-function
2.61. register-namespace
2.62. register-xhtml-namespace
2.63. register-xsh-namespace
2.64. remove
2.65. rename
2.66. return
2.67. run-mode
2.68. save
2.69. select
2.70. set-enc
2.71. set-standalone
2.72. skip-dtd
2.73. sort
2.74. stream
2.75. strip-whitespace
2.76. switch-to-new-documents
2.77. test-mode
2.78. throw
2.79. try
2.80. undef
2.81. unfold
2.82. unless
2.83. unregister-function
2.84. unregister-namespace
2.85. valid
2.86. validate
2.87. validation
2.88. variables
2.89. verbose
2.90. version
2.91. while
2.92. xcopy
2.93. xinsert
2.94. xmove
2.95. xpath-axis-completion
2.96. xpath-completion
2.97. xslt
2.98. xupdate

2.1. assign

Usage

assign $id=xpath

$id=xpath

assign %id=xpath

%id=xpath

Description

In the first two cases (where dollar sign appears) store the result of evaluation of the xpath in a variable named $id. In this case, xpath is evaluated in a simmilar way as in the case of the count: if it results in a literal value this value is used. If it results in a node-list, number of nodes occuring in that node-list is used. Use the string() XPath function to obtain a literal values in these cases.

Example 9. String expressions

xsh> $a=string(chapter/title)
xsh> $b="hallo world"

Example 10. Arithmetic expressions

xsh> $a=5*100
xsh> $a
$a=500
xsh> $a=(($a+5) div 10)
xsh> $a
$a=50.5

Example 11. Counting nodes

xsh> $a=//chapter
xsh> $a
$a=10
xsh> %chapters=//chapter
xsh> $a=%chapters
xsh> $a
$a=10

Example 12. Some caveats of counting node-lists

xsh> ls ./creature
<creature race='hobbit' name="Bilbo"/>

## WRONG (@name results in a singleton node-list) !!!
xsh> $name=@name
xsh> $name
$name=1

## CORRECT (use string() function)
xsh> $name=string(@name)
xsh> $name
$name=Bilbo

In the other two cases (where percent sign appears) find all nodes matching a given xpath and store the resulting node-list in the variable named %id. The variable may be later used instead of an XPath expression.

See Also

variables

2.2. backups

Usage

backups

Description

Enable creating backup files on save (default).

This command is equivalent to setting the $BACKUPS variable to 1.

See Also

nobackups

2.3. call

Usage

call id [xpath | expression]*

Description

Call an XSH subroutine named id previously created using def. If the subroutine requires some paramters, these have to be specified after the id. Node-list parameters are given by means of xpath expressions. String parameters have to be string expressions.

See Also

def, return

2.4. catalog

Usage

catalog expression

Description

Will use a given catalog file as a catalog during all parsing processes. Using a catalog will significantly speed up parsing processes if many external ressources are loaded into the parsed documents (such as DTDs or XIncludes)

2.5. cd

Usage

cd [xpath]

Aliases

chxpath

Description

Change current context node (and current document) to the first node matching a given xpath argument.

2.6. clone

Usage

clone id=id

Aliases

dup

Description

Make a copy of the document identified by the id following the equal sign assigning it the identifier of the first id.

See Also

open, close, enc, documents

2.7. close

Usage

close [id]

Description

Close the document identified by id, removing its parse-tree from memory (note also that all nodes belonging to the document are removed from all nodelists they appear in). If id is omitted, the command closes the current document.

2.8. copy

Usage

copy xpath location xpath

Aliases

cp

Description

Copies nodes matching the first xpath to the destinations determined by the location directive relative to the second xpath. If more than one node matches the first xpath than it is copied to the position relative to the corresponding node matched by the second xpath according to the order in which are nodes matched. Thus, the n'th node matching the first xpath is copied to the location relative to the n'th node matching the second xpath.

The possible values for location are: after, before, into, replace and cause copying the source nodes after, before, into (as the last child-node). the destination nodes. If replace location is used, the source node is copied before the destination node and the destination node is removed.

Some kind of type conversion is used when the types of the source and destination nodes are not equal. Thus, text, cdata, comment or processing instruction node data prepend, append or replace value of a destination attribute when copied before,after/into or instead (replace) an attribute, and vice versa.

Attributes may be copied after, before or into some other attribute to append, prepend or replace the destination attribute value. They may also replace the destination attribute completely (both its name and value). To copy an attribute from one element to another, simply copy the attribute node into the destination element.

Elements may be copied into other elements (which results in appending the child-list of the destination element), or before, after or instead (replace) other nodes of any type except attributes.

Example 13. Replace living-thing elements in the document b with the coresponding creature elements of the document a.

xsh> copy a://creature replace b://living-thing

2.9. count

Usage

count xpath

Aliases

print_value, get

Description

Calculate a given xpath expression. If the result is a node-list, return number of nodes in the node-list. If the xpath results in a boolean, numeric or literal value, return the value.

2.10. create

Usage

create id expression

Aliases

new

Description

Create a new document using expression to form the root element and associate it with a given identifier.

xsh> create t1 root
xsh> ls /
<?xml version="1.0" encoding="utf-8"?>
<root/>

xsh> create t2 "<root id='r0'>Just a <b>test</b></root>"
xsh> ls /
<?xml version="1.0" encoding="utf-8"?>
<root id='r0'>Just a <b>test</b></root>
xsh> files
scratch = new_document.xml
t1 = new_document1.xml
t2 = new_document2.xml

See Also

open, clone

2.11. debug

Usage

debug

Description

Turn on debugging messages.

This is equivalent to setting $DEBUG variable to 1.

See Also

nodebug

2.12. def

Usage

def id [$id | %id]* command-block or def id [$id | %id]*;

Aliases

define

Description

Define a new XSH subroutine named id. The subroutine may require zero or more parameters of nodelist or string type. These are declared as a whitespace-separated list of (so called) parametric variables (of nodelist or string type). The body of the subroutine is specified as a command-block. Note, that all subroutine declarations are processed during the parsing and not at run-time, so it does not matter where the subroutine is defined.

The routine can be later invoked using the call command followed by the routine name and parameters. Nodelist parameters must be given as an XPath expressions, and are evaluated just before the subroutine's body is executed. String parameters must be given as (string) expressions. Resulting node-lists/strings are stored into the parametric variables before the body is executed. These variables are local to the subroutine's call tree (see also the local command). If there is a global variable using the same name as some parametric variable, the original value of the global variable is replaced with the value of the parametric variable for the time of the subroutine's run-time.

Note that subroutine has to be declared before it is called with call. If you cannot do so, e.g. if you want to call a subroutine recursively, you have to pre-declare the subroutine using a def with no command-block. There may be only one full declaration (and possibly one pre-declaration) of a subroutine for one id and the declaration and pre-declaration has to define the same number of arguments and their types must match.

def l3 %v {
  ls %v 3; # list given nodes upto depth 3
}
call l3 //chapter;

Example 14. Commenting and un-commenting pieces of document

def comment
    %n      # nodes to move to comments
    $mark   # maybe some handy mark to recognize such comments
{
  foreach %n {
    if ( . = ../@* ) {
      echo "Warning: attribute nodes are not supported!";
    } else {
      echo "Commenting out:";
      ls .;
      local $node = "";
      ls . |> $node;
      add comment "$mark$node" replace .;
    }
  }
}

def uncomment %n $mark {
  foreach %n {
    if (. = ../comment()) { # is this node a comment node
      local $string = substring-after(.,"$mark");
      add chunk $string replace .;
    } else {
      echo "Warning: Ignoring non-comment node:";
      ls . 0;
    }
  }
}


# comment out all chapters with no paragraphs
call comment //chapter[not(para)] "COMMENT-NOPARA";

# uncomment all comments (may not always be valid!)
$mark="COMMENT-NOPARA";
call uncomment //comment()[starts-with(.,"$mark")] $mark;

See Also

call, return, local

2.13. defs

Usage

defs

Description

List names and parametric variables for all defined XSH routines.

See Also

def, variables

2.14. doc-info

Usage

doc-info [expression]

Aliases

doc_info

Description

In the present implementation, this command displays information provided in the <?xml ...?> declaration of a document: version, encoding, standalone, plus information about level of gzip compression of the original XML file.

2.15. documents

Usage

files

Aliases

files, docs

Description

List open files and their identifiers.

See Also

open, close

2.16. dtd

Usage

dtd [id]

Description

Print external or internal DTD for a given document. If no document identifier is given, the current document is used.

See Also

valid, validate

2.17. empty-tags

Usage

empty-tags expression

Aliases

empty_tags

Description

If the value of expression is 1 (non-zero), empty tags are serialized as a start-tag/end-tag pair (<foo></foo>). This option affects both ls and save and possibly other commands. Otherwise, they are compacted into a short-tag form (<foo/>). Default value is 0.

This command is equivalent to setting the $EMPTY_TAGS variable.

2.18. enc

Usage

enc [id]

Description

Print the original document encoding string. If no document identifier is given, the current document is used.

See Also

set-enc

2.19. encoding

Usage

encoding enc-string

Description

Set the default output character encoding.

This command is equivalent to setting the $ENCODING variable.

2.20. exec

Usage

exec expression [expression ...]

Aliases

system

Description

execute the system command(s) in expressions.

Example 15. Count words in "hallo wold" string, then print name of your machine's operating system.

exec echo hallo world;                 # prints hallo world
exec "echo hallo word" | wc; # counts words in hallo world
exec uname;                            # prints operating system name

2.21. exit

Usage

exit [expression]

Aliases

quit

Description

Exit xsh immediately, optionally with the exit-code resulting from a given expression.

WARNING: No files are saved on exit.

2.22. fold

Usage

fold xpath [expression]

Description

This feature is still EXPERIMENTAL! Fold command may be used to mark elements matching the xpath with a xsh:fold attribute from the http://xsh.sourceforge.net/xsh/ namespace. When listing the DOM tree using ls xpath fold, elements marked in this way are folded to the depth given by the expression (default depth is 0 = fold immediately).

xsh> fold //chapter 1
xsh> ls //chapter[1] fold
<chapter id="intro" xsh:fold="1">
  <title>...</title>
  <para>...</para>
  <para>...</para>
</chapter>

See Also

unfold, ls

2.23. foreach

Aliases

for

Description

If the first argument is an xpath expression, execute the command-block for each node matching the expression making it temporarily the current node, so that all relative XPath expressions are evaluated in its context.

If the first argument is a perl-code, it is evaluated and the resulting perl-list is iterated setting the variable $__ (note that there are two underscores!) to be each element of the list in turn. It works much like perl's foreach, except that the variable used consists of two underscores.

Example 16. Move all employee elements in a company element into a staff subelement of the same company

xsh> foreach //company xmove ./employee into ./staff;

Example 17. List content of all XML files in current directory

xsh> foreach { glob('*.xml') } { open f=$__; list f:/; }

2.24. help

Usage

help command|argument-type

Aliases

?

Description

Print help on a given command or argument type.

2.25. if

Description

Execute command-block if a given xpath or perl-code expression evaluates to a non-emtpty node-list, true boolean-value, non-zero number or non-empty literal. If the first test fails, check all possibly following elsif conditions and execute the corresponding command-block for the first one of them which is true. If none of them succeeds, execute the else command-block (if any).

Example 18. Display node type

def node_type %n {
  foreach (%n) {
    if ( . = self::* ) { # XPath trick to check if . is an element
      echo 'element';
    } elsif ( . = ../@* ) { # XPath trick to check if . is an attribute
      echo 'attribute';
    } elsif ( . = ../processing-instruction() ) {
      echo 'pi';
    } elsif ( . = ../text() ) {
      echo 'text';
    } elsif ( . = ../comment() ) {
      echo 'comment'
    } else { # well, this should not happen, but anyway, ...
      echo 'unknown-type';
    }
  }
}

2.26. ifinclude

Usage

ifinclude filename

Description

Include a file named filename and execute all XSH commands therein unless the file was already included using either include of ifinclude.

See Also

include

2.27. include

Usage

include filename

Aliases

.

Description

Include a file named filename and execute all XSH commands therein.

See Also

ifinclude

2.28. indent

Usage

indent expression

Description

If the value of expression is 1, format the XML output while saving a document by adding some nice ignorable whitespace. If the value is 2 (or higher), XSH will act as in case of 1, plus it will add a leading and a trailing linebreak to each text node.

Note, that since the underlying C library (libxml2) uses a hardcoded indentation of 2 space characters per indentation level, the amount of whitespace used for indentation can not be altered on runtime.

This command is equivalent to setting the $INDENT variable.

2.29. insert

Usage

insert node-type expression [namespace expression] location xpath

Aliases

add

Description

Works just like xadd, except that the new node is attached only the first node matched.

See Also

xinsert, move, xmove

2.30. iterate

Usage

iterate xpath command-block

Description

Iterate works very much like the XPath variant of foreach, except that iterate evaluates the command-block as soon as a new node matching a given xpath is found. As a limitation, the xpath expresion used with iterate may only consist of one XPath step, i.e. it cannot contain an XPath step separator /.

What are the benefits of iterate over a foreach loop, then? Well, under some circumstances it is efficiency, under other there are none. To clarify this, we have to dive a bit deeper into the details of XPath implementation. By definition, the node-list resulting from evaluation of an XPath has to be ordered in the canonical document order. That means that an XPath implementation must contain some kind of a sorting algorithm. This would not itself be much trouble if a relative document order of two nodes of a DOM tree could be determined in a constant time. Unfortunately, the libxml2 library, used behind XSH, does not implement mechanisms that would allow this complexity restriction (which is, however, quite natural and reasonable approach if all the consequences are considered). Thus, when comparing two nodes, libxml2 traverses the tree to find their nearest common ancestor and at that point determines the relative order of the two subtrees by trying to seek one of them in a list of right siblings of the other. This of course cannot be handled in a constant time. As a result, the sorting algorithm, reasonably efficient for a constant time comparison (polynomial of a degree < 1.5) or small node-lists, becomes rather unusable for huge node-lists with linear time comparison (still polynomial but of a degree > 2).

The iterate command provides a way to avoid sorting the resulting nodelist by limiting allowed XPath expression to one step (and thus one axis) at a time. On the other hand, since iterate is implemented in Perl, a proxy object glueing the C and Perl layers has to be created for every node the iterator passes by. This (plus some extra subroutine calls) makes it about two to three times slower compared to a similar tree-traversing algorithm used by libxml2 itself during XPath evaluation.

Our experience shows that iterate beats foreach in performance on large node-lists (>=1500 nodes, but your milage may vary) while foreach wins on smaller node-lists.

The following two examples give equivallent results. However, the one using iterate may be faster esp. if the number of nodes being counted is very large.

Example 19. Count inhabitants of the kingdom of Rohan in productive age

cd rohan/inhabitants;
iterate child::*[@age>=18 and @age<60] { perl $productive++ };
echo "$productive inhabitants in productive age";

Example 20. Using XPath

$productive=count(rohan/inhabitants/*[@age>=18 and @age<60]);
echo "$productive inhabitants in productive age";

Use e.g. | time cut pipe-line redirection to benchmark a XSH command on a UNIX system.

See Also

foreach, next, prev, last

2.31. keep-blanks

Usage

keep_blanks expression

Aliases

keep_blanks

Description

Allows you to turn off XML::LibXML's default behaviour of maintaining whitespace in the document. Non-zero expression forces the XML parser to preserve all whitespace.

This command is equivalent to setting the $KEEP_BLANKS variable.

2.32. last

Usage

last [expression]

Description

The last command is like the break statement in C (as used in loops); it immediately exits an enclosing loop. The optional expression argument may evaluate to a positive integer number that indicates which level of the nested loops to quit. If this argument is omitted, it defaults to 1, i.e. the innermost loop.

Using this command outside a subroutine causes an immediate run-time error.

2.33. lcd

Usage

lcd expression

Aliases

chdir

Description

Changes the filesystem working directory to expression, if possible. If expression is omitted, changes to the directory specified in HOME environment variable, if set; if not, changes to the directory specified by LOGDIR environment variable.

2.34. load-ext-dtd

Usage

load_ext_dtd expression

Aliases

load_ext_dtd

Description

If the expression is non-zero, XML parser loads external DTD subsets while parsing. By default, this option is enabled.

This command is equivalent to setting the $LOAD_EXT_DTD variable.

2.35. local

Usage

local $id = xpath

local %id = xpath

local $id|%id [ $id|%id ... ]

Description

This command acts in a very similar way as assign does, except that the variable assignment is done temporarily and lasts only for the rest of the nearest enclosing command-block. At the end of the enclosing block or subroutine the original value is restored. This command may also be used without the assignment part and assignments may be done later using the usual assign command.

Note, that the variable itself is not lexically is still global in the sense that it is still visible to any subroutine called subsequently from within the same block. A local just gives temporary values to global (meaning package) variables. Unlike Perl's my declarations it does not create a local variable. This is known as dynamic scoping. Lexical scoping is not implemented in XSH.

To sum up for Perl programmers: local in XSH works exactly the same as local in Perl.

See Also

assign, def

2.36. locate

Usage

locate xpath

Description

Print canonical XPaths leading to nodes matched by a given xpath.

See Also

pwd

2.37. ls

Usage

ls xpath [expression]

Aliases

list

Description

List the XML representation of all nodes matching xpath. The optional expression argument may be provided to specify the depth of XML tree listing. If negative, the tree will be listed to unlimited depth. If the expression results in the word fold, elements marked with the fold command are folded, i.e. listed only to a certain depth (this feature is still EXPERIMENTAL!).

Unless in quiet mode, this command prints also number of nodes matched on stderr.

If the xpath parameter is omitted, current context node is listed to the depth of 1.

See Also

count, fold, unfold

2.38. map

Usage

map perl-code xpath

Aliases

sed

Description

This command provides an easy way to modify node's data (content) using arbitrary Perl code.

Each of the nodes matching xpath is passes its data to the perl-code via the $_ variable and receives the (possibly) modified data using the same variable.

Since element nodes do not really have any proper content (they are only a storage for other nodes), node's name (tag) is used in case of elements. Note, however, that recent versions of XSH provide a special command rename with a very similar syntax to map, that should be used for renaming element, attribute, and processing instruction nodes.

Example 21. Capitalises all hobbit names

xsh> map { $_=ucfirst($_) } //hobbit/@name

Example 22. Changes goblins to orcs in all hobbit tales.

xsh> map { s/goblin/orc/gi } //hobbit/tale/text()

2.39. move

Usage

move xpath location xpath

Aliases

mv

Description

move command acts exactly like copy, except that it removes the source nodes after a succesfull copy. Remember that the moved nodes are actually different nodes from the original ones (which may not be obvious when moving nodes within a single document into locations that do not require type conversion). So, after the move, the original nodes do not exist neither in the document itself nor any nodelist variable.

See copy for more details on how the copies of the moved nodes are created.

2.40. namespaces

Usage

namespaces [xpath]

Description

For each node matching given xpath lists all namespaces that are valid in its scope in the form of xmlns:prefix="uri" declarations. If no xpath is given, lists namespaces in the scope of the current node.

2.41. next

Usage

next [expression]

Description

The next command is like the continue statement in C; it starts the next iteration of an enclosing loop. The optional expression argument may evaluate to a positive integer number that indicates which level of the nested loops should be restarted. If omitted, it defaults to 1, i.e. the innermost loop.

Using this command outside a loop causes an immediate run-time error.

2.42. nobackups

Usage

nobackups

Description

Disable creating backup files on save.

This command is equivalent to setting the $BACKUPS variable to 0.

See Also

nobackups

2.43. nodebug

Usage

nodebug

Description

Turn off debugging messages.

This is equivalent to setting $DEBUG variable to 0.

See Also

debug

2.44. normalize

Usage

normalize xpath

Description

normalize puts all text nodes in the full depth of the sub-tree underneath each node selected by a given xpath, into a "normal" form where only structure (e.g., elements, comments, processing instructions, CDATA sections, and entity references) separates text nodes, i.e., there are neither adjacent Text nodes nor empty Text nodes.

2.45. open

Usage

[open [HTML|XML|DOCBOOK] [FILE|PIPE|STRING]] id=expression

Description

Load a new XML, HTML or SGML DOCBOOK document from the file (actually arbitrary URL), command output or string provided by the expression. In XSH the document is given a symbolic name id. To identify the documentin commands like close, save, validate, dtd or enc simply use id. In commands which work on document nodes, give id: prefix to XPath expressions to point the XPath to the document.

xsh> open x=mydoc.xml # open a document

# open a HTML document from the Internet
xsh> open HTML h="http://www.google.com/?q=xsh"
# quote file name if it contains whitespace
xsh> open y="document with a long name with spaces.xml"

# you may omit the word open when loading an XML file/URI.
xsh> z=mybook.xml

# use HTML or DOCBOOK keywords to load these types
xsh> open HTML z=index.htm

# use PIPE keyword to read output of a command
xsh> open HTML PIPE z='wget -O - xsh.sourceforge.net/index.html'

# use z: prefix to identify the document opened with the
# previous comand in an XPath expression.
xsh> ls z://chapter/title	    

2.46. options

Usage

options

Aliases

flags

Description

List current values of all XSH flags and options (such as validation flag or query-encoding).

Example 23. Store current settings in your .xshrc

xsh> options | cat > ~/.xshrc

2.47. parser-completes-attributes

Usage

parser-completes-attributes expression

Aliases

complete_attributes, complete-attributes, parser_completes_attributes

Description

If the expression is non-zero, this command allows XML parser to complete the elements attributes lists with the ones defaulted from the DTDs. By default, this option is enabled.

This command is equivalent to setting the $PARSER_COMPLETES_ATTRIBUTES variable.

2.48. parser-expands-entities

Usage

parser_expands_entities expression

Aliases

parser_expands_entities

Description

Enable the entity expansion during the parse process if the expression is non-zero, disable it otherwise. If entity expansion is off, any external parsed entities in the document are left as entities. Defaults to on.

This command is equivalent to setting the $PARSER_EXPANDS_ENTITIES variable.

2.49. parser-expands-xinclude

Usage

parser_expands_xinclude expression

Aliases

parser_expands_xinclude

Description

If the expression is non-zero, the parser is allowed to expand XIinclude tags imidiatly while parsing the document.

This command is equivalent to setting the $PARSER_EXPANDS_XINCLUDE variable.

2.50. pedantic-parser

Usage

pedantic_parser expression

Aliases

pedantic_parser

Description

If you wish, you can make XML::LibXML more pedantic by passing a non-zero expression to this command.

This command is equivalent to setting the $PEDANTIC_PARSER variable.

2.51. perl

Usage

eval perl-code

Aliases

eval

Description

Evaluate a given perl expression.

See Also

count

2.52. prev

Usage

prev [expression]

Description

This command is only allowed inside an iterate loop. It returns the iteration one step back, to the previous node on the iterated axis. The optional expression argument may be used to indicate to which level of nested loops the command applies to.

See Also

iterate, redo, last, next

2.53. print

Usage

print expression [expression ...]

Aliases

echo

Description

Interpolate and print a given expression(s).

2.54. process-xinclude

Usage

process_xinclude [id]

Aliases

process_xinclude, process-xincludes, process_xincludes, xinclude, xincludes, load_xincludes, load-xincludes, load_xinclude, load-xinclude

Description

Process any xinclude tags in the document id.

2.55. pwd

Usage

pwd

Description

Print XPath leading to the current context node. This is equivalent to locate ..

See Also

locate

2.56. query-encoding

Usage

query-encoding enc-string

Aliases

query_encoding

Description

Set the default query character encoding.

This command is equivalent to setting the $QUERY_ENCODING variable.

2.57. quiet

Usage

quiet

Description

Turn off verbose messages.

This command is equivalent to setting the $QUIET variable.

See Also

verbose

2.58. recovering

Usage

recovering expression

Description

Turn on recovering parser mode if the expression is non-zero or off otherwise. Defaults to off. Note, that the in the recovering mode, validation is not performed by the parser even if the validation flag is on and that recovering mode flag only influences parsing of XML documents (not HTML).

The recover mode helps to efficiently recover documents that are almost well-formed. This for example includes documents without a close tag for the document element (or any other element inside the document).

This command is equivalent to setting the $RECOVERING variable.

2.59. redo

Usage

redo [expression]

Description

The redo command restarts a loop block without evaluating the conditional again. The optional expression argument may evaluate to a positive integer number that indicates which level of the nested loops should be restarted. If omitted, it defaults to 1, i.e. the innermost loop.

Using this command outside a loop causes an immediate run-time error.

Example 24. Restart a higher level loop from an inner one

while ($i<100) { 
  # ...
  foreach //para {
    # some code
    if $param { 
      redo; # redo foreach loop
    } else {
      redo 2; # redo while loop
    }
  }
}

2.60. register-function

Usage

register-function expression perl-code

Aliases

regfunc

Description

EXPERIMENTAL! Register given perl code as a new XPath extension function under a name provided in the first argument (expression). XML::LibXML DOM API may be used in the perl code for object processing. If the name contains a colon, then the first part before the colon must be a registered namespace prefix (see register-namespace) and the function is registered within the corresponding namespace.

2.61. register-namespace

Usage

register-namespace expression expression

Aliases

regns

Description

Registers the first argument as a prefix for the namespace given in the second argument. The prefix can later be used in XPath expressions.

2.62. register-xhtml-namespace

Usage

register-xhtml-namespace expression

Aliases

regns-xhtml

Description

Registers a prefix for the XHTML namespace. The prefix can later be used in XPath expressions.

2.63. register-xsh-namespace

Usage

register-xsh-namespace expression

Aliases

regns-xsh

Description

Registers a new prefix for the XSH namespace. The prefix can later be used in XPath expressions. Note, that XSH namespace is by default registered with xsh prefix. This command is thus, in general, useful only when some document uses xsh prefix for a different namespace.

2.64. remove

Usage

remove xpath

Aliases

rm, prune, delete, del

Description

Remove all nodes matching xpath.

Example 25. Get rid of all evil creatures.

xsh> del //creature[@manner='evil']

2.65. rename

Usage

rename perl-code xpath

Description

This command is very similar to the map command, except that it operates on nodes' names rather than their data/values. For every element, attribute or processing-instruction matched by the xpath expression the following procedure is used: 1) the name of the node is stored into Perl's $_ variable, 2) the perl-code is evaluated, and 3) the (posibly changed) content of the $_ variable is used as a new name for the node.

Example 26. Renames all hobbits to halflings

xsh> map $_='halfling' //hobbit

Example 27. Make all elements and attributes uppercase

xsh> map { $_=uc($_) } (//*|//@*)

See Also

map

2.66. return

Usage

return

Description

This command immediatelly stops the execution of a procedure it occurs in and returns the execution to the place of the script from which the subroutine was called.

Using this command outside a subroutine causes an immediate run-time error.

See Also

def, call

2.67. run-mode

Usage

run-mode

Aliases

run_mode

Description

Switch into normal XSH mode in which all commands are executed.

This is equivalent to setting $TEST_MODE variable to 0.

See Also

test-mode

2.68. save

Usage

save [HTML|XML|XInclude] [FILE|PIPE|STRING] id expression [encoding enc-string] or save id or save

Description

Save the document identified by id. Using one of the FILE, PIPE, STRING keywords the user may choose to save the document to a file send it to a given command's input via a pipe or simply return its content as a string. If none of the keywords is used, it defaults to FILE. If saving to a PIPE, the expression argument must provide the coresponding command and all its parameters. If saving to a FILE, the expression argument may provide a filename; if omitted, it defaults to the original filename of the document. If saving to a STRING, the expression argument is ignored and may freely be omitted.

The output format is controlled using one of the XML, HTML, XInclude keywords (see below). If the format keyword is ommited, save it defaults to XML.

Note, that a document should be saved as HTML only if it actually is a HTML document. Note also, that the optional encoding parameter forces character conversion only; it is up to the user to declare the document encoding in the appropriate HTML <META> tag.

The XInclude keyword automatically implies XML format and can be used to force XSH to save all already expanded XInclude sections back to their original files while replacing them with <xi:include> tags in the main XML file. Moreover, all material included within <include> elements from the http://www.w3.org/2001/XInclude namespace is saved to separate files too according to the href attribute, leaving only empty <include> element in the root file. This feature may be used to split the document to new XInclude fragments.

The encoding keyword followed by a enc-string can be used to convert the document from its original encoding to a different encoding. In case of XML output, the <?xml?> declaration is changed accordingly. The new encoding is also set as the document encoding for the particular document.

Example 28. Use save to preview a HTML document in Lynx

save HTML PIPE mydoc 'lynx -stdin'

See Also

open, close, enc, documents

2.69. select

Usage

select id

Description

Make id the document identifier to be used in the next xpath evaluation without identifier prefix.

xsh> a=mydoc1.xml# opens and selects a
xsh> ls /# lists a
xsh> b=mydoc2.xml# opens and selects b
xsh> ls /# lists b
xsh> ls a:/# lists and selects a
xsh> select b# does nothing except selecting b
xsh> ls /# lists b

2.70. set-enc

Usage

set-enc enc-string [id]

Description

Changes character encoding of a given document. If no document id is given, the command applies to the current document. This has two effects: changing the XMLDecl encoding declaration in the document prolog to display the new encoding and making all future save operations on the document default to the given charset.

xsh> ls
<?xml version="1.0" encoding="iso-8859-1"?>
<foo>...</foo>
xsh> set-enc "utf-8"
xsh> ls
<?xml version="1.0" encoding="utf-8"?>
<foo>...</foo>
xsh> save# saves the file in UTF-8 encoding

See Also

enc, doc-info

2.71. set-standalone

Usage

set-standalone expression [id]

Description

Changes the value of standalone declaration in the XMLDecl prolog of a document. The expression should evaluate to either 1 or 0 or 'yes' or 'no'. The result of applying the command on other values is not specified. If no document id is given, the command applies to the current document.

See Also

doc-info

2.72. skip-dtd

Usage

skip-dtd expression

Aliases

skip_dtd

Description

If the value of expression is 1 (non-zero), DTD DOCTYPE declaration is omitted from any serialization of XML documents (including ls and save). Default value is 0.

This command is equivalent to setting the $SKIP_DTD variable.

2.73. sort

Description

EXPERIMENTAL! This command is not yet guaranteed to remain in the future releases.

DOCUMENTATION OBSOLETE! Syntax changed!

This command may be used to sort the node-list stored in the node-list variable id. First, for each node in the node-list %id, the first argument (either a xpath or perl-code expression), which serves as a sorting criterion, is evaluated in the context of the node and the obtained value is stored together with the node. (In case of xpath the result of whatever type is cast to a string). Then perl's sorting algorithm is used to sort the nodelist, consulting the second, perl-code, argument to compare nodes. Before the perl-code is evaluated, the values obtained from the previous evaluation of the sorting crierion argument on the two nodes being compared are stored into $a and $b variables in the respective order. The perl-code being consulted is supposed to return either -1 (the first node should come first), 0 (no order precedence), or 1 (the second node should come first). Note that Perl provides very convenient operators cmp and <=> for string and numeric comparison of this kind as shown in the examples below.

Remember that sort (unlike assign, if, or while) evaluates the first xpath argument (the sorting criterion) in a way to obtain a string. Thus you need not to bother with wrapping node-queries with a string() function but you must remember to explicitly wrap the expression in count() if the number of the nodes is to be the sorting criterion.

Example 29. Sort creatures by name (XPath-based sort) in ascending order using current locale settings

xsh> local %c=/middle-earth[1]/creatures
xsh> sort @name { use locale; lc($a) cmp lc($b) } %c
xsh> xmove %c into /middle-earth[1]# replaces the creatures

Example 30. Sort (descending order) a node-list by score (Perl-based sort)

xsh> sort { $scores{ literal('@name') } } { $b <=> $a } %players

2.74. stream

Usage

stream input [FILE|PIPE|STRING] expression output [FILE|PIPE|STRING] expression select xpath command-block [ select xpath command-block ... ]

Description

EXPERIMENTAL! This command provides a memory efficient (though slower) way to process selected parts of an XML document with XSH. A streaming XML parser (SAX parser) is used to parse the input. The parser has two states which will be refered to as A and B below. The initial state of the parser is A.

In the state A, only a limited vertical portion of the DOM tree is built. All XML data comming from the input stream other than start-tags are immediatelly copied to the output stream. If a new start-tag of an element arrives, a new node is created in the tree. All siblings of the newly created node are removed. Thus, in the state A, there is exactly one node on every level of the tree. After a node is added to the tree, all the xpath expressions following the select keyword are checked. If none matches, the parser remains in state A and copies the start-tag to the output stream. Otherwise, the first expression that matches is remembered and the parser changes its state to B.

In state B the parser builds a complete DOM subtree of the element that was last added to the tree before the parser changed its state from A to B. No data are sent to the output at this stage. When the subtree is complete (i.e. the corresponding end-tag for its topmost element is encountered), the command-block of instructions following the xpath expression that matched is invoked with the root element of the subtree as the current context node. The commands in command-block are allowed to transform the whole element subtree or even to replace it with a different DOM subtree or subtrees. They must, however, preserve the element's parent as well as all its ancestor nodes intact. Failing to do so can result in an error or unpredictable results.

After the subtree processing command-block returns, all subtrees that now appear in the DOM tree in the place of the original subtree are serialized to the output stream. After that, they are deleted and the parser returns to state A.

Note that this type of processing highly limits the amount of information the XPath expressions can use. First notable fact is that elements can not be selected by their content. The only information present in the tree at the time of the XPath evaluation is the element's name and attributes plus the same information for all its ancestors. There is nothing known yet about possible child nodes of the element as well as of the node's position within its siblings.

2.75. strip-whitespace

Usage

strip xpath

Aliases

strip_whitespace

Description

strip-whitespace removes all leading and trailing whitespace from given nodes. If applied to an element node, it removes all leading and trailing child text nodes and CDATA sections that consist entirely of whitespace.

2.76. switch-to-new-documents

Usage

switch-to-new-documents expression

Aliases

switch_to_new_documents

Description

If non-zero, XSH changes current node to the document node of a newly open/created files every time a new document is opened or created with open or create. Default value for this option is 1.

This command is equivalent to setting the $SWITCH_TO_NEW_DOCUMENTS variable.

2.77. test-mode

Usage

test-mode

Aliases

test_mode

Description

Switch into test mode in which no commands are actually executed and only command syntax is checked.

This is equivalent to setting $TEST_MODE variable to 1.

See Also

run-mode

2.78. throw

Usage

throw expression

Description

This command throws and exception containing error message given by the obligatory expression argument. If the exception is not handled by some surrounding try block, the execution is stopped immediatelly and the error message is printed.

Note: There is a special class of internal exceptions with error message starting with a word 'UNCATCHABLE'. Such exceptions are not trapped by try constructions and should be avoided in ordinary XSH scripts.

See Also

try

2.79. try

Usage

try command-block catch [[local] $id] command-block

Description

Execute command-block following the try keyword. If an error or exception occures during the evaluation, execute the catch command-block. If a variable follows catch and the try block fails, an error message of the exception occured is stored to the variable before the catch block is executed. Optionally, the variable name may be preceded with the keyword local in order to make the assignment local to the catch block (see local).

The throw command and the equivalent perl construction perl { die "error message" } allow user to throw custom exceptions.

Example 31. Handle parse errors

try {
  open XML doc=$input;
} catch {
  try {
    echo "XML parser failed, trying HTML";
    open HTML doc=$input;
  } catch local $error {
    echo "Stopping due to errors: $error";
    exit 1;
  }
}

See Also

throw

2.80. undef

Usage

undef expression

Aliases

undefine

Description

This command can be used to undefine previously defined XSH subroutines. The expression is evaluated as a Perl regular expression. All subroutines whose names match are undefined. Note, that like def, all undef commands are processed during the compilation of the source code, not at run-time, so it doesn't matter how deep in the code is a undef command nested.

xsh> include my_defs.xsh
xsh> call my_sub1 //foo;
xsh> call my_sub2 //bar;
xsh> undefine 'my_sub.*'
xsh> # change/edit the definitions in my_defs.xsh and reload
xsh> include my_defs.xsh

2.81. unfold

Usage

unfold xpath

Description

This feature is still EXPERIMENTAL! Unfold command removes xsh:fold attributes from all elements matching a given xpath created by previous usage of fold. Be aware, that xmlns:xsh namespace declaration may still be present in the document even when all elements are unfolded.

See Also

fold, ls

2.82. unless

Description

Like if but negating the result of the expression.

See Also

if

2.83. unregister-function

Usage

unregister-function expression

Aliases

unregfunc

Description

EXPERIMENTAL! Unregiseter XPath extension function of a given name previously registered using register-function.

2.84. unregister-namespace

Usage

unregister-namespace expression

Aliases

unregns

Description

Unregisters given namespace prefix previously registered using register-namespace. The prefix can no longer be used in XPath expressions unless declared within the current scope of the queried document.

2.85. valid

Usage

valid [validation-scheme] [id]

Description

Check and report the validity of the document id with respect to a DTD, RelaxNG, or XSD schemas specified in validation-scheme (see validate for information, on how validation-scheme may be specified). Prints "yes" if the document is valid and "no" otherwise. If no document identifier is given, the current document is used. If no validation-scheme is specified, the validity against the DTD subset is checked.

See Also

validate, dtd

2.86. validate

Usage

validate [id] or validate DTD PUBLIC expression [SYSTEM filename] id or validate (DTD|RelaxNG|XSD) FILE filename [id] or validate (DTD|RelaxNG|XSD) STRING filename [id] or validate (RelaxNG|XSD) DOC id [id]

Description

This command validates the document identified with id against a DTD, RelaxNG or XSD schema and report all validity errors. If no document identifier is given, the current document is used. A DTD can be specified either by its PUBLIC or SYSTEM identifier (or both), or as a STRING. RelaxNG and XSD schemas can be specified either as a filename or url (FILE filename), as a string (STRING expression), or as a XSH document (DOC id). If no schema is specified, validation is performed against the internal or external DTD subset of the document being validated.

open mydoc="test.xml"
# in all examples below, mydoc can be ommited
validate mydoc; # validate against the documet's DOCTYPE
validate DTD PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" mydoc
validate DTD SYSTEM "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" mydoc
validate DTD FILE "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" mydoc
validate RelaxNG FILE "test.rng" mydoc
validate RelaxNG STRING $relaxschema mydoc
open rng="test.rng"
validate RelaxNG DOC rng mydoc
validate XSD FILE "test.xsd" mydoc
validate XSD STRING $xsdschema mydoc
open xsd="test.xsd"
validate XSD DOC xsd mydoc

See Also

valid, dtd

2.87. validation

Usage

validation expression

Description

Turn on validation during the parse process if the expression is non-zero or off otherwise. In XSH version 1.6 and later, defaults to off.

This command is equivalent to setting the $VALIDATION variable.

2.88. variables

Usage

variables

Aliases

vars, var

Description

List all defined variables and their values.

See Also

documents, defs

2.89. verbose

Usage

verbose

Description

Turn on verbose messages (default).

This is equivalent to setting $QUIET variable to 0.

See Also

quiet

2.90. version

Usage

version

Description

Prints program version plus version numbers of the most important libraries used.

2.91. while

Description

Execute command-block as long as the given xpath or perl-code expression evaluates to a non-emtpty node-list, true boolean-value, non-zero number or non-empty literal.

Example 32. The commands have the same results

xsh> while /table/row remove /table/row[1];
xsh> remove /table/row;

2.92. xcopy

Usage

xcopy xpath location xpath

Aliases

xcp

Description

xcopy is similar to copy, but copies *all* nodes matching the first xpath to *all* destinations determined by the location directive relative to the second xpath. See copy for detailed description of xcopy arguments.

Example 33. Copy all middle-earth creatures within the document a into every world of the document b.

xsh> xcopy a:/middle-earth/creature into b://world

2.93. xinsert

Usage

xinsert node-type expression [namespace expression] location xpath

Aliases

xadd

Description

Use the expression to create a new node of a given node-type in the location relative to the given xpath.

For element nodes, the format of the expression should look like "<element-name att-name='attvalue' ...>". The < and > characters are optional. If no attributes are used, the expression may simply consist the element name. Note, that in the first case, the quotes are required since the expression contains spaces.

Attribute nodes use the following syntax: "att-name='attvalue' [...]".

For the other types of nodes (text, cdata, comments) the expression should contain the node's literal content. Again, it is necessary to quote all whitespace and special characters as in any expression argument.

The location argument should be one of: after, before, into, replace, append or prepend. See documentation of the location argument type for more detail.

The namespace expression is only valid for elements and attributes and must evaluate to the namespace URI. In that case, the element or attribute name must have a prefix. The created node is associated with a given namespace.

Example 34. Append a new Hobbit element to the list of middle-earth creatures and name him Bilbo.

xsh> xadd element "<creature race='hobbit' manner='good'>" \
  into /middle-earth/creatures
xsh> xadd attribute "name='Bilbo'" \
  into /middle-earth/creatures/creature[@race='hobbit'][last()]

See Also

insert, move, xmove

2.94. xmove

Usage

xmove xpath location xpath

Aliases

xmv

Description

Like xcopy, except that xmove removes the source nodes after a succesfull copy. Remember that the moved nodes are actually different nodes from the original ones (which may not be obvious when moving nodes within a single document into locations that do not require type conversion). So, after the move, the original nodes do not exist neither in the document itself nor any nodelist variable.

See xcopy for more details on how the copies of the moved nodes are created.

The following example demonstrates how xcopy can be used to get rid of HTML <font> elements while preserving their content. As an exercise, try to find out why simple foreach //font { xmove node() replace . } would not work here.

Example 35. Get rid of all <font> tags

while //font[1] {
  foreach //font[1] {
    xmove ./node() replace .;
  }
}

2.95. xpath-axis-completion

Usage

xpath-axis-completion expression

Aliases

xpath_axis_completion

Description

The following values are allowed: always, never, when-empty. Note, that all other values (including 1) work as never!

If the expression evaluates to always, TAB completion for XPath expressions always includes axis names.

If the expression evaluates to when-empty, the TAB completion list for XPath expressions includes axis names only if no element name matches the completion.

If the expression evaluates to never, the TAB completion list for XPath expressions never includes axis names.

The default value for this optio is always.

This command is equivalent to setting the $XPATH_AXIS_COMPLETION variable.

2.96. xpath-completion

Usage

xpath_completion expression

Aliases

xpath_completion

Description

If the expression is non-zero, enable the TAB completion for xpath expansions in the interactive shell mode, disable it otherwise. Defaults to on.

This command is equivalent to setting the $XPATH_COMPLETION variable.

2.97. xslt

Usage

xslt id filename id [(params|parameters) name=expression [name=expression ...]]

Aliases

transform, xsl, xsltproc, process

Description

Load an XSLT stylesheet from a file and use it to transform the document of the first id into a new document named id. Parameters may be passed to a stylesheet after params keyword in the form of a list of name=value pairs where name is the parameter name and value is an expression interpolating to its value. The resulting value is interpretted by XSLT processor as an XPath expression so e.g. quotes surrounding a XPath string have to be quoted themselves to preveserve them during the XSH expression interpolation.

xslt src stylesheet.xsl rslt params font="'14pt'" color="'red'"

2.98. xupdate

Usage

xupdate id [id]

Description

Modify the current document or the document specified by the second id argument according to XUpdate commands of the first id document. XUpdate is a XML Update Language which aims to be a language for updating XML documents.

XUpdate langauge is described in XUpdate Working Draft at http://www.xmldb.org/xupdate/xupdate-wd.html.

XUpdate output can be generated for example by Python xmldiff utility from http://www.logilab.org/xmldiff/. Unfortunatelly, there are few bugs (or, as I tend to say In case of Python, white-space problems) in their code, so its XUpdate output is not always correct.

3. Type Reference

3.1. filename

Description

An expression which interpolates to a valid file name or URL.

3.2. xPath

Description

XSH supports arbitrary XPath expression as defined in W3C recommendation at http://www.w3.org/TR/xpath. (Nice interactive XPath tutorials and references can be found at http://www.zvon.org.) In XSH, XPath expressoin may be optionally preceded with a document identifier followed by colon (id:xpath). If no document identifier is given, the current document is used.

As an extension, the following XPath extension functions are defined in the XSH namespace:

xsh:doc(id-string) - returns a nodelist consisting of the document node associated in XSH with an identifier given in id-string.

xsh:matches(match-string,regexp-string) - returns true if match-string matches the regular expression given in regexp-string. Otherwise returns false.

xsh:grep(node-set, regexp-string) - returns a node set consisting of nodes of the given node-set whose content (as returned by the built-in XPath function string()) matches the regular expression given in regexp-string.

xsh:same(node-set1, node-set2) - returns true if the given node sets both contain the same node (in XPath, this can also be expressed as count(node-set1|node-set2)+count(node-set1)+count(node-set2)=1).

Example 36. Open a document and count all sections containing a subsection

xsh scratch:/> open v = mydocument1.xml;
xsh v:/> open k = mydocument2.xml;
xsh k:/> count //section[subsection];# searches k
xsh k:/> count v://section[subsection];# searches v

3.3. command-block

Description

XSH command or a block of semicolon-separated commands enclosed within curly brackets.

Example 37. Count paragraphs in each chapter

$i=0;
foreach //chapter {
  $c=count(./para);
  $i=$i+1;
  print "$c paragraphs in chapter no.$i";
}

3.4. enc_string

Description

An expression which interpolates to a valid encoding string, e.g. to utf-8, utf-16, iso-8859-1, iso-8859-2, windows-1250 etc.

3.5. expression

Description

Expression is a string consisting of unquoted characters other than whitespace or semicolon, single quote or double quote characters or quoted characters of any kind (but see also special case of expression - so called here-documents - described below). Quoting means either preceding a single character with a backslash or enclosing a part of the string into single quotes '...' or double quotes "...". Quoting characters are removed from the string so they must be quoted themselves if they are a part of the expression: \\, \' or " ' ", \" or ' " '. Unquoted (sub)expressons and (sub)expressions quoted with double-quotes are subject to variable, Perl, and XPath expansions.

Variable expansion replaces substrings of the form $id or ${id} with the value of the variable named $id, unless the '$' sign is quoted.

Perl expansion evaluates every substring enclosed in between ${{{ and }}} as a Perl expresson (in very much the same way as the perl command) and replaces the whole thing with the resulting value.

XPath interpolation evaluates every substring enclosed in between ${{ and }} as an XPath expression (in very much the same way as the count command) and substitutes the whole thing with the resul.

For convenience, another kind XPath interpolation is performed on expressions. It replaces any substring occuring between ${( and )} with a literal result of XPath evaluation of the string. This means, that if the evaluation results in a node-list, the textual content of its first node is substituted rather than the number of nodes in the node-list (as with ${{ ... }}).

echo foo "bar"                        # prints: foo bar
echo foo"bar"                         # prints: foobar
echo foo'"bar"'                       # prints: foo"bar"
echo foo"'b\\a\"r'"                   # prints: foo'b\a"r'
$a="bar"
echo foo$a                            # prints: foobar
echo foo\$a                           # prints: foo$a
echo '$a'                             # prints: '$a'
echo "'$a'"                           # prints: 'bar'
echo "${{//middle-earth/creatures}}"  # prints: 10
echo '${{//middle-earth/creatures}}'  # prints: ${{//middle-earth/creatures}}
echo ${{//creature[1]/@name}}         # !!! prints: 1
echo ${(//creature[1]/@name)}         # prints: Bilbo
echo ${{{ join(",",split(//,$a)) }}}  # prints: b,a,r

There is one more special type of expressions, so called ``here-documents'' following syntax of similar constructs in Bash and Perl. Following a << you specify a string to terminate the quoted material, and all lines following the current line down to the terminating string are the value of the expression. The terminating string is either quoted or unquoted identifier (a word). If quoted, the type of quotes you use determines the treatment of the text, just as in regular quoting, i.e. in case of double quotes, the material contained in the here-document is subject to variable, Perl, and XPath expansions. An unquoted identifier works just like double quotes. There must be no space between the << and the identifier. The terminating string must appear by itself (unquoted and with no surrounding whitespace) on the terminating line.

$a="bar"
echo foo <<END baz;
xx $a yy
END
# prints foo xx bar yy baz
echo foo <<"END" baz;
xx $a yy
END
# same as above
echo foo <<'END' baz;
xx $a yy
END
# prints foo xx $a yy baz

3.6. id

Description

An identifier, that is, a string beginning with a letter or underscore, and containing letters, underscores, and digits.

3.7. location

Description

One of: after, before, into, append, prepend, replace.

NOTE: XSH 1.6 introduces two new values for location argument: append and prepend and slighlty changes behavior of after and before!

This argument is required by all commands that insert nodes to a document in some way to a destination described by an XPath expression. The meaning of the values listed above is supposed be obvious in most cases, however the exact semantics for location argument values depends on types of both the source node and the target node.

after/before place the node right after/before the destination node, except for when the destination node is a document node or one of the source nodes is an attribute: If the destination node is a document node, the source node is attached to the end/beginning of the document (remember: there is no "after/before a document"). If both the source and destination nodes are attributes, then the source node is simply attached to the element containing the destination node (remember: there is no order on attribute nodes). If the destination node is an attribute but the source node is of a different type, then the textual content of the source node is appended to the value of the destination attribute (i.e. in this case after/before act just as append/prepend).

append/prepend appends/prepends the source node to the destination node. If the destination node can contain other nodes (i.e. it is an element or a document node) then the entire source node is attached to it. In case of other destination node types, the textual content of the source node is appended/prepended to the content of the destination node.

into can also be used to place the source node to the end of an element (in the same way as append), to attach an attribute to an element, or, if the destination node is a text node, cdata section, processing-instruction, attribute or comment, to replace its textual content with the textual content of the source node.

replace replaces the entire destination node with the source node except for the case when the destination node is an attribute and the source node is not. In such a case only the value of the destination attribute is replaced with the textual content of the source node. Note also that document node can never be replaced.

3.8. node-type

Description

One of: element, attribute, text, cdata, comment, chunk and (EXPERIMENTALLY!) entity_reference. A chunk is a character string which forms a well-balanced peace of XML.

add element hobbit into //middle-earth/creatures;
add attribute 'name="Bilbo"' into //middle-earth/creatures/hobbit[last()];
add chunk '<hobbit name="Frodo">A small guy from <place>Shire</place>.</hobbit>' 
  into //middle-earth/creatures;

3.9. perl-code

Description

A block of perl code enclosed in curly brackets or an expression which interpolates to a perl expression. Variables defined in XSH are visible in perl code as well. Since, in the interactive mode, XSH redirects output to the terminal, you cannot simply use perl print function for output if you want to filter the result with a shell command. Instead use the predefined perl routine echo(...) which is equivalent to Perl's print $::OUT .... The $::OUT perl-variable stores the reference to the terminal file handle.

For more information about embedded Perl code in XSH, predefined functions etc. see Perl_shell.

xsh> $i="foo";
xsh> eval { echo "$i-bar\n"; }# prints foo-bar
xsh> eval 'echo "\$i-bar\n";'# exactly the same as above
xsh> eval 'echo "$i-bar\n";'# prints foo-bar too, but $i is
    # interpolated by XSH. Perl actually evaluates echo "foo-bar\n";