# This file was automatically generated from src/xsh_grammar.xml on 
# Wed Sep 10 17:53:03 2003

package XML::XSH::Help;
use strict;
use vars qw($HELP %HELP);


$HELP=<<'END';
General notes:

  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: 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>variable.

Example: 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.

END

$HELP{'toc'}=[<<'END'];

Help items:
-----------

  toc - this page

  XSH Language Topics:

    Argtypes - Argument Types
    Configuration - Options
    Documents - Files/Documents
    Flow - Flow control
    Information - Retrieving more information
    Manipulation - Tree modification
    Navigation - Tree navigation
    Perl_shell - Interacting with Perl and Shell
    Variables - Variables

  XSH Commands:

    assign, backups, call, catalog, cd, clone, close, copy, count, create,
    debug, def, defs, doc-info, documents, dtd, empty-tags, enc, encoding,
    exec, exit, fold, foreach, help, if, ifinclude, include, indent,
    insert, iterate, keep-blanks, last, lcd, load-ext-dtd, local, locate,
    ls, map, move, namespaces, next, nobackups, nodebug, normalize, open,
    options, parser-completes-attributes, parser-expands-entities,
    parser-expands-xinclude, pedantic-parser, perl, prev, print,
    process-xinclude, pwd, query-encoding, quiet, recovering, redo,
    register-function, register-namespace, register-xhtml-namespace,
    register-xsh-namespace, remove, rename, return, run-mode, save, select,
    set-enc, set-standalone, skip-dtd, sort, stream, strip-whitespace,
    switch-to-new-documents, test-mode, throw, try, undef, unfold, unless,
    unregister-function, unregister-namespace, valid, validate, validation,
    variables, verbose, version, while, xcopy, xinsert, xmove,
    xpath-axis-completion, xpath-completion, xslt, xupdate

  XSH Argument Types:

    command-block, enc-string, expression, filename, id, location,
    node-type, perl-code, xpath

END

$HELP{'command'}=[<<'END'];
List of XSH commands

description:
	     assign, backups, call, catalog, cd, clone, close, copy, count,
	     create, debug, def, defs, doc-info, documents, dtd,
	     empty-tags, enc, encoding, exec, exit, fold, foreach, help,
	     if, ifinclude, include, indent, insert, iterate, keep-blanks,
	     last, lcd, load-ext-dtd, local, locate, ls, map, move,
	     namespaces, next, nobackups, nodebug, normalize, open,
	     options, parser-completes-attributes, parser-expands-entities,
	     parser-expands-xinclude, pedantic-parser, perl, prev, print,
	     process-xinclude, pwd, query-encoding, quiet, recovering,
	     redo, register-function, register-namespace,
	     register-xhtml-namespace, register-xsh-namespace, remove,
	     rename, return, run-mode, save, select, set-enc,
	     set-standalone, skip-dtd, sort, stream, strip-whitespace,
	     switch-to-new-documents, test-mode, throw, try, undef, unfold,
	     unless, unregister-function, unregister-namespace, valid,
	     validate, validation, variables, verbose, version, while,
	     xcopy, xinsert, xmove, xpath-axis-completion,
	     xpath-completion, xslt, xupdate

END


$HELP{'command-block'}=[<<'END'];
command-block argument type

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

Example:     Count paragraphs in each chapter

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

END


$HELP{'type'}=[<<'END'];
List of command argument types

description:
	     command-block, enc-string, expression, filename, id, location,
	     node-type, perl-code, xpath

END


$HELP{'expression'}=[<<'END'];
expression argument type

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 `${{ ... }}').

Example:
             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.

Example:
             $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

END


$HELP{'enc-string'}=[<<'END'];
enc_string argument type

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.

END


$HELP{'id'}=[<<'END'];
id argument type

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

END


$HELP{'filename'}=[<<'END'];
Filename argument type

description:
	     An <expression> which interpolates to a valid file name or
	     URL.

END


$HELP{'xpath'}=[<<'END'];
XPath argument type

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:     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

END


$HELP{'try'}=[<<'END'];
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:     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

END


$HELP{'if'}=[<<'END'];
usage:       if <xpath>|<perl-code> <command>
             if <xpath>|<perl-code>
    <command-block> [ elsif <command-block> ]* [ else <command-block> ]
             
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:     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';
                 }
               }
             }

END


$HELP{'unless'}=[<<'END'];
usage:       unless <xpath>|<perl-code>
    <command>
             unless <xpath>|<perl-code>
    <command-block> [ else <command-block> ]
             
description:
	     Like if but negating the result of the expression.

see also:     if

END


$HELP{'while'}=[<<'END'];
usage:       while <xpath>|<perl-code> <command-block>
             
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:     The commands have the same results

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

END


$HELP{'foreach'}=[<<'END'];
usage:       foreach <xpath>|<perl-code> 
    <command>|<command-block>
             
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:     Move all employee elements in a company element into a staff
	     subelement of the same company

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

Example:     List content of all XML files in current directory

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

END

$HELP{'for'}=$HELP{'foreach'};

$HELP{'undef'}=[<<'END'];
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.

Example:
             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

END

$HELP{'undefine'}=$HELP{'undef'};

$HELP{'def'}=[<<'END'];
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) <expression>s.
	     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.

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

Example:     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

END

$HELP{'define'}=$HELP{'def'};

$HELP{'assign'}=[<<'END'];
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:     String expressions

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

Example:     Arithmetic expressions

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

Example:     Counting nodes

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

Example:     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

END


$HELP{'local'}=[<<'END'];
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

END


$HELP{'options'}=[<<'END'];
usage:       options
             
aliases:     flags

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

Example:     Store current settings in your .xshrc

             xsh> options | cat > ~/.xshrc

END

$HELP{'flags'}=$HELP{'options'};

$HELP{'defs'}=[<<'END'];
usage:       defs
             
description:
	     List names and parametric variables for all defined XSH
	     routines.

see also:     def variables

END


$HELP{'ifinclude'}=[<<'END'];
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

END


$HELP{'include'}=[<<'END'];
usage:       include <filename>
             
aliases:     .

description:
	     Include a file named <filename> and execute all XSH commands
	     therein.

see also:     ifinclude

END

$HELP{'.'}=$HELP{'include'};

$HELP{'call'}=[<<'END'];
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 <expression>s.

see also:     def return

END


$HELP{'help'}=[<<'END'];
usage:       help <command>|argument-type
             
aliases:     ?

description:
	     Print help on a given command or argument type.

END

$HELP{'?'}=$HELP{'help'};

$HELP{'exec'}=[<<'END'];
usage:       exec <expression> [<expression> ...]
             
aliases:     system

description:
	     execute the system command(s) in <expression>s.

Example:     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

END

$HELP{'system'}=$HELP{'exec'};

$HELP{'xslt'}=[<<'END'];
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.

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

END

$HELP{'transform'}=$HELP{'xslt'};
$HELP{'xsl'}=$HELP{'xslt'};
$HELP{'xsltproc'}=$HELP{'xslt'};
$HELP{'process'}=$HELP{'xslt'};

$HELP{'documents'}=[<<'END'];
usage:       files
             
aliases:     files docs

description:
	     List open files and their identifiers.

see also:     open close

END

$HELP{'files'}=$HELP{'documents'};
$HELP{'docs'}=$HELP{'documents'};

$HELP{'variables'}=[<<'END'];
usage:       variables
             
aliases:     vars var

description:
	     List all defined variables and their values.

see also:     documents defs

END

$HELP{'vars'}=$HELP{'variables'};
$HELP{'var'}=$HELP{'variables'};

$HELP{'copy'}=[<<'END'];
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:     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

END

$HELP{'cp'}=$HELP{'copy'};

$HELP{'xcopy'}=[<<'END'];
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:     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

END

$HELP{'xcp'}=$HELP{'xcopy'};

$HELP{'lcd'}=[<<'END'];
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.

END

$HELP{'chdir'}=$HELP{'lcd'};

$HELP{'insert'}=[<<'END'];
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

END

$HELP{'add'}=$HELP{'insert'};

$HELP{'xinsert'}=[<<'END'];
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:     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

END

$HELP{'xadd'}=$HELP{'xinsert'};

$HELP{'node-type'}=[<<'END'];
Node-type argument 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.

Example:
             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;

END


$HELP{'location'}=[<<'END'];
Location argument type

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.

END


$HELP{'move'}=[<<'END'];
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.

see also:     copy xmove insert xinsert

END

$HELP{'mv'}=$HELP{'move'};

$HELP{'xmove'}=[<<'END'];
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:     Get rid of all <font> tags

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

see also:     xcopy move insert xinsert

END

$HELP{'xmv'}=$HELP{'xmove'};

$HELP{'clone'}=[<<'END'];
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

END

$HELP{'dup'}=$HELP{'clone'};

$HELP{'normalize'}=[<<'END'];
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.

END


$HELP{'strip-whitespace'}=[<<'END'];
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.

END

$HELP{'strip_whitespace'}=$HELP{'strip-whitespace'};

$HELP{'ls'}=[<<'END'];
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

END

$HELP{'list'}=$HELP{'ls'};

$HELP{'count'}=[<<'END'];
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.

END

$HELP{'print_value'}=$HELP{'count'};
$HELP{'get'}=$HELP{'count'};

$HELP{'perl-code'}=[<<'END'];
Perl-code argument type

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>.

Example:
             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";

END


$HELP{'perl'}=[<<'END'];
usage:       eval <perl-code>
             
aliases:     eval

description:
	     Evaluate a given perl expression.

see also:     count

END

$HELP{'eval'}=$HELP{'perl'};

$HELP{'remove'}=[<<'END'];
usage:       remove <xpath>
             
aliases:     rm prune delete del

description:
	     Remove all nodes matching <xpath>.

Example:     Get rid of all evil creatures.

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

END

$HELP{'rm'}=$HELP{'remove'};
$HELP{'prune'}=$HELP{'remove'};
$HELP{'delete'}=$HELP{'remove'};
$HELP{'del'}=$HELP{'remove'};

$HELP{'print'}=[<<'END'];
usage:       print <expression> [<expression> ...]
             
aliases:     echo

description:
	     Interpolate and print a given expression(s).

END

$HELP{'echo'}=$HELP{'print'};

$HELP{'sort'}=[<<'END'];
usage:       sort <xpath>|<perl-code> <perl-code> %<id>
             
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:     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:     Sort (descending order) a node-list by score (Perl-based sort)

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

END


$HELP{'map'}=[<<'END'];
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:     Capitalises all hobbit names

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

Example:     Changes goblins to orcs in all hobbit tales.

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

END

$HELP{'sed'}=$HELP{'map'};

$HELP{'rename'}=[<<'END'];
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:     Renames all hobbits to halflings

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

Example:     Make all elements and attributes uppercase

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

see also:     map

END


$HELP{'close'}=[<<'END'];
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.

END


$HELP{'select'}=[<<'END'];
usage:       select <id>
             
description:
	     Make <id> the document identifier to be used in the next xpath
	     evaluation without identifier prefix.

Example:
             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

END


$HELP{'open'}=[<<'END'];
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.

Example:
             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

END


$HELP{'create'}=[<<'END'];
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.

Example:
             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

END

$HELP{'new'}=$HELP{'create'};

$HELP{'save'}=[<<'END'];
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:     Use save to preview a HTML document in Lynx

             save HTML PIPE mydoc 'lynx -stdin'

see also:     open close enc documents

END


$HELP{'dtd'}=[<<'END'];
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

END


$HELP{'set-enc'}=[<<'END'];
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.

Example:
             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

END


$HELP{'set-standalone'}=[<<'END'];
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

END


$HELP{'enc'}=[<<'END'];
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

END


$HELP{'validate'}=[<<'END'];
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.

Example:
             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

Example:
             validate RelaxNG FILE "test.rng" mydoc
             validate RelaxNG STRING $relaxschema mydoc
             open rng="test.rng"
             validate RelaxNG DOC rng mydoc

Example:
             validate XSD FILE "test.xsd" mydoc
             validate XSD STRING $xsdschema mydoc
             open xsd="test.xsd"
             validate XSD DOC xsd mydoc

see also:     valid dtd

END


$HELP{'valid'}=[<<'END'];
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

END


$HELP{'exit'}=[<<'END'];
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.

END

$HELP{'quit'}=$HELP{'exit'};

$HELP{'process-xinclude'}=[<<'END'];
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>.

see also:     parser-expands-xinclude

END

$HELP{'process_xinclude'}=$HELP{'process-xinclude'};
$HELP{'process-xincludes'}=$HELP{'process-xinclude'};
$HELP{'process_xincludes'}=$HELP{'process-xinclude'};
$HELP{'xinclude'}=$HELP{'process-xinclude'};
$HELP{'xincludes'}=$HELP{'process-xinclude'};
$HELP{'load_xincludes'}=$HELP{'process-xinclude'};
$HELP{'load-xincludes'}=$HELP{'process-xinclude'};
$HELP{'load_xinclude'}=$HELP{'process-xinclude'};
$HELP{'load-xinclude'}=$HELP{'process-xinclude'};

$HELP{'cd'}=[<<'END'];
usage:       cd [<xpath>]
             
aliases:     chxpath

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

END

$HELP{'chxpath'}=$HELP{'cd'};

$HELP{'pwd'}=[<<'END'];
usage:       pwd
             
description:
	     Print XPath leading to the current context node. This is
	     equivalent to `locate .'.

see also:     locate

END


$HELP{'locate'}=[<<'END'];
usage:       locate <xpath>
             
description:
	     Print canonical XPaths leading to nodes matched by a given
	     <xpath>.

see also:     pwd

END


$HELP{'xupdate'}=[<<'END'];
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.

END


$HELP{'verbose'}=[<<'END'];
usage:       verbose
             
description:
	     Turn on verbose messages (default).

	     This is equivalent to setting `$QUIET' variable to 0.

see also:     quiet

END


$HELP{'test-mode'}=[<<'END'];
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

END

$HELP{'test_mode'}=$HELP{'test-mode'};

$HELP{'run-mode'}=[<<'END'];
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

END

$HELP{'run_mode'}=$HELP{'run-mode'};

$HELP{'debug'}=[<<'END'];
usage:       debug
             
description:
	     Turn on debugging messages.

	     This is equivalent to setting `$DEBUG' variable to 1.

see also:     nodebug

END


$HELP{'nodebug'}=[<<'END'];
usage:       nodebug
             
description:
	     Turn off debugging messages.

	     This is equivalent to setting `$DEBUG' variable to 0.

see also:     debug

END


$HELP{'version'}=[<<'END'];
usage:       version
             
description:
	     Prints program version plus version numbers of the most
	     important libraries used.

END


$HELP{'validation'}=[<<'END'];
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.

END


$HELP{'recovering'}=[<<'END'];
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.

END


$HELP{'parser-expands-entities'}=[<<'END'];
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.

END

$HELP{'parser_expands_entities'}=$HELP{'parser-expands-entities'};

$HELP{'keep-blanks'}=[<<'END'];
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.

END

$HELP{'keep_blanks'}=$HELP{'keep-blanks'};

$HELP{'pedantic-parser'}=[<<'END'];
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.

END

$HELP{'pedantic_parser'}=$HELP{'pedantic-parser'};

$HELP{'parser-completes-attributes'}=[<<'END'];
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.

END

$HELP{'complete_attributes'}=$HELP{'parser-completes-attributes'};
$HELP{'complete-attributes'}=$HELP{'parser-completes-attributes'};
$HELP{'parser_completes_attributes'}=$HELP{'parser-completes-attributes'};

$HELP{'indent'}=[<<'END'];
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.

END


$HELP{'empty-tags'}=[<<'END'];
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.

END

$HELP{'empty_tags'}=$HELP{'empty-tags'};

$HELP{'skip-dtd'}=[<<'END'];
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.

END

$HELP{'skip_dtd'}=$HELP{'skip-dtd'};

$HELP{'parser-expands-xinclude'}=[<<'END'];
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.

see also:     process-xinclude

END

$HELP{'parser_expands_xinclude'}=$HELP{'parser-expands-xinclude'};

$HELP{'load-ext-dtd'}=[<<'END'];
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.

END

$HELP{'load_ext_dtd'}=$HELP{'load-ext-dtd'};

$HELP{'encoding'}=[<<'END'];
usage:       encoding <enc-string>
             
description:
	     Set the default output character encoding.

	     This command is equivalent to setting the `$ENCODING'
	     variable.

END


$HELP{'query-encoding'}=[<<'END'];
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.

END

$HELP{'query_encoding'}=$HELP{'query-encoding'};

$HELP{'quiet'}=[<<'END'];
usage:       quiet
             
description:
	     Turn off verbose messages.

	     This command is equivalent to setting the `$QUIET' variable.

see also:     verbose

END


$HELP{'switch-to-new-documents'}=[<<'END'];
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.

END

$HELP{'switch_to_new_documents'}=$HELP{'switch-to-new-documents'};

$HELP{'backups'}=[<<'END'];
usage:       backups
             
description:
	     Enable creating backup files on save (default).

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

see also:     nobackups

END


$HELP{'nobackups'}=[<<'END'];
usage:       nobackups
             
description:
	     Disable creating backup files on save.

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

see also:     nobackups

END


$HELP{'fold'}=[<<'END'];
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).

Example:
             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

END


$HELP{'unfold'}=[<<'END'];
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

END


$HELP{'redo'}=[<<'END'];
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:     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
                 }
               }
             }

see also:     foreach while iterate next last

END


$HELP{'next'}=[<<'END'];
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.

see also:     foreach while iterate redo last prev

END


$HELP{'prev'}=[<<'END'];
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

END


$HELP{'last'}=[<<'END'];
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.

see also:     foreach while iterate next last

END


$HELP{'return'}=[<<'END'];
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

END


$HELP{'throw'}=[<<'END'];
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

END


$HELP{'catalog'}=[<<'END'];
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)

END


$HELP{'iterate'}=[<<'END'];
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:     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:     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

END


$HELP{'register-namespace'}=[<<'END'];
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.

END

$HELP{'regns'}=$HELP{'register-namespace'};

$HELP{'unregister-namespace'}=[<<'END'];
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.

END

$HELP{'unregns'}=$HELP{'unregister-namespace'};

$HELP{'register-xhtml-namespace'}=[<<'END'];
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.

END

$HELP{'regns-xhtml'}=$HELP{'register-xhtml-namespace'};

$HELP{'register-xsh-namespace'}=[<<'END'];
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.

END

$HELP{'regns-xsh'}=$HELP{'register-xsh-namespace'};

$HELP{'register-function'}=[<<'END'];
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.

END

$HELP{'regfunc'}=$HELP{'register-function'};

$HELP{'unregister-function'}=[<<'END'];
usage:       unregister-function <expression>
             
aliases:     unregfunc

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

END

$HELP{'unregfunc'}=$HELP{'unregister-function'};

$HELP{'stream'}=[<<'END'];
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.

END


$HELP{'namespaces'}=[<<'END'];
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.

END


$HELP{'xpath-completion'}=[<<'END'];
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.

END

$HELP{'xpath_completion'}=$HELP{'xpath-completion'};

$HELP{'xpath-axis-completion'}=[<<'END'];
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.

END

$HELP{'xpath_axis_completion'}=$HELP{'xpath-axis-completion'};

$HELP{'doc-info'}=[<<'END'];
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.

see also:     set-enc set-standalone

END

$HELP{'doc_info'}=$HELP{'doc-info'};

$HELP{'Documents'}=[<<'END'];
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>navigated and <manipulated>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: Store XSH document DOC on a remote machine using Secure Shell

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


Related commands:
  backups, catalog, clone, close, create, documents, nobackups, open,
  process-xinclude, save, select, stream, switch-to-new-documents

END

$HELP{'Navigation'}=[<<'END'];
Tree navigation
---------------

  With XSH, it is possible to browse <document trees>document trees as if
  they were a local filesystem, except that <XPath>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>.

Example:
  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:/>


Related commands:
  cd, fold, locate, ls, pwd, register-function, register-namespace,
  register-xhtml-namespace, register-xsh-namespace, select, unfold,
  unregister-function, unregister-namespace

END

$HELP{'Manipulation'}=[<<'END'];
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).

Example:
  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: 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>


Related commands:
  clone, copy, insert, map, move, normalize, process-xinclude, remove,
  rename, set-enc, set-standalone, strip-whitespace, xcopy, xinsert, xmove,
  xslt, xupdate

END

$HELP{'Flow'}=[<<'END'];
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.


Related commands:
  call, def, exit, foreach, if, ifinclude, include, iterate, last, next,
  prev, redo, return, run-mode, stream, test-mode, throw, try, undef,
  unless, while

END

$HELP{'Information'}=[<<'END'];
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.


Related commands:
  count, defs, doc-info, documents, dtd, enc, help, locate, ls, namespaces,
  options, print, pwd, valid, validate, variables, version

END

$HELP{'Argtypes'}=[<<'END'];
Argument Types
--------------

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

END

$HELP{'Variables'}=[<<'END'];
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>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 (`%').

  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>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>string expressions,
    <XPath 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:

Example:
    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';

  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:

Example:
    # 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.

  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:

Example:
    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:

Example:
    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); 
    };


Related commands:
  assign, local

END

$HELP{'Configuration'}=[<<'END'];
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.

Example:
  xsh> options | cat > ~/.xshrc


Related commands:
  backups, debug, empty-tags, encoding, indent, keep-blanks, load-ext-dtd,
  nobackups, nodebug, options, parser-completes-attributes,
  parser-expands-entities, parser-expands-xinclude, pedantic-parser,
  query-encoding, quiet, recovering, register-function, register-namespace,
  register-xhtml-namespace, register-xsh-namespace, run-mode, skip-dtd,
  switch-to-new-documents, test-mode, unregister-function,
  unregister-namespace, validation, verbose, xpath-axis-completion,
  xpath-completion

END

$HELP{'Perl_shell'}=[<<'END'];
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.

  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>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: 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: 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;
      }
    };

  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'.

  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).

Example:
    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: Use grep and less to display context of `funny'

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

Example: The same on Windows 2000/XP systems

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


Related commands:
  exec, lcd, map, perl, rename

END

$HELP{'commands'}=$HELP{'command'};

1;
__END__