line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# This file was automatically generated from src/xsh_grammar.xml on |
2
|
|
|
|
|
|
|
# Wed Sep 10 17:53:03 2003 |
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
package XML::XSH::Help; |
5
|
4
|
|
|
4
|
|
19
|
use strict; |
|
4
|
|
|
|
|
6
|
|
|
4
|
|
|
|
|
104
|
|
6
|
4
|
|
|
4
|
|
19
|
use vars qw($HELP %HELP); |
|
4
|
|
|
|
|
7
|
|
|
4
|
|
|
|
|
16044
|
|
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
$HELP=<<'END'; |
10
|
|
|
|
|
|
|
General notes: |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
XSH acts as a command interpreter. Individual commands must be separated |
13
|
|
|
|
|
|
|
with a semicolon. Each command may be followed by a pipeline redirection |
14
|
|
|
|
|
|
|
to capture the command's output. In the interactive shell, backslash may |
15
|
|
|
|
|
|
|
be used at the end of line to indicate that the command follows on the |
16
|
|
|
|
|
|
|
next line. |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
A pipeline redirections may be used either to feed the command's output |
19
|
|
|
|
|
|
|
to a unix command or to store it in a XSH string variable. |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
In the first case, the syntax is `xsh-command | shell-command ;' where |
22
|
|
|
|
|
|
|
`xsh-command' is any XSH command and `shell-command' is any command (or |
23
|
|
|
|
|
|
|
code) recognized by the default shell interpreter of the operating system |
24
|
|
|
|
|
|
|
(i.e. on UNIX systems by `sh' or `csh', on Windows systems by `cmd'). |
25
|
|
|
|
|
|
|
Brackets may be used to join more shell commands (may depend on which |
26
|
|
|
|
|
|
|
shell is used). |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
Example: Count attributes of words containing string foo in its name or |
29
|
|
|
|
|
|
|
value. |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
xsh> ls //words/@* | grep foo | wc |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
In order to store a command's output in a string variable, the pipeline |
34
|
|
|
|
|
|
|
redirection must take the form `xsh-command |> $variable' where |
35
|
|
|
|
|
|
|
`xsh-command' is any XSH command and `$variable' is any valid name for a |
36
|
|
|
|
|
|
|
string variable. |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
Example: Store the number of all words in a variable named count. |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
xsh> count //words |> $count |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
` command' gives a list of all XSH commands. |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
` type' gives a list of all argument types. |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
`' followed by a command or type name gives more information on the |
47
|
|
|
|
|
|
|
particular command or argument type. |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
END |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
$HELP{'toc'}=[<<'END']; |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
Help items: |
54
|
|
|
|
|
|
|
----------- |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
toc - this page |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
XSH Language Topics: |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
Argtypes - Argument Types |
61
|
|
|
|
|
|
|
Configuration - Options |
62
|
|
|
|
|
|
|
Documents - Files/Documents |
63
|
|
|
|
|
|
|
Flow - Flow control |
64
|
|
|
|
|
|
|
Information - Retrieving more information |
65
|
|
|
|
|
|
|
Manipulation - Tree modification |
66
|
|
|
|
|
|
|
Navigation - Tree navigation |
67
|
|
|
|
|
|
|
Perl_shell - Interacting with Perl and Shell |
68
|
|
|
|
|
|
|
Variables - Variables |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
XSH Commands: |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
assign, backups, call, catalog, cd, clone, close, copy, count, create, |
73
|
|
|
|
|
|
|
debug, def, defs, doc-info, documents, dtd, empty-tags, enc, encoding, |
74
|
|
|
|
|
|
|
exec, exit, fold, foreach, help, if, ifinclude, include, indent, |
75
|
|
|
|
|
|
|
insert, iterate, keep-blanks, last, lcd, load-ext-dtd, local, locate, |
76
|
|
|
|
|
|
|
ls, map, move, namespaces, next, nobackups, nodebug, normalize, open, |
77
|
|
|
|
|
|
|
options, parser-completes-attributes, parser-expands-entities, |
78
|
|
|
|
|
|
|
parser-expands-xinclude, pedantic-parser, perl, prev, print, |
79
|
|
|
|
|
|
|
process-xinclude, pwd, query-encoding, quiet, recovering, redo, |
80
|
|
|
|
|
|
|
register-function, register-namespace, register-xhtml-namespace, |
81
|
|
|
|
|
|
|
register-xsh-namespace, remove, rename, return, run-mode, save, select, |
82
|
|
|
|
|
|
|
set-enc, set-standalone, skip-dtd, sort, stream, strip-whitespace, |
83
|
|
|
|
|
|
|
switch-to-new-documents, test-mode, throw, try, undef, unfold, unless, |
84
|
|
|
|
|
|
|
unregister-function, unregister-namespace, valid, validate, validation, |
85
|
|
|
|
|
|
|
variables, verbose, version, while, xcopy, xinsert, xmove, |
86
|
|
|
|
|
|
|
xpath-axis-completion, xpath-completion, xslt, xupdate |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
XSH Argument Types: |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
command-block, enc-string, expression, filename, id, location, |
91
|
|
|
|
|
|
|
node-type, perl-code, xpath |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
END |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
$HELP{'command'}=[<<'END']; |
96
|
|
|
|
|
|
|
List of XSH commands |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
description: |
99
|
|
|
|
|
|
|
assign, backups, call, catalog, cd, clone, close, copy, count, |
100
|
|
|
|
|
|
|
create, debug, def, defs, doc-info, documents, dtd, |
101
|
|
|
|
|
|
|
empty-tags, enc, encoding, exec, exit, fold, foreach, help, |
102
|
|
|
|
|
|
|
if, ifinclude, include, indent, insert, iterate, keep-blanks, |
103
|
|
|
|
|
|
|
last, lcd, load-ext-dtd, local, locate, ls, map, move, |
104
|
|
|
|
|
|
|
namespaces, next, nobackups, nodebug, normalize, open, |
105
|
|
|
|
|
|
|
options, parser-completes-attributes, parser-expands-entities, |
106
|
|
|
|
|
|
|
parser-expands-xinclude, pedantic-parser, perl, prev, print, |
107
|
|
|
|
|
|
|
process-xinclude, pwd, query-encoding, quiet, recovering, |
108
|
|
|
|
|
|
|
redo, register-function, register-namespace, |
109
|
|
|
|
|
|
|
register-xhtml-namespace, register-xsh-namespace, remove, |
110
|
|
|
|
|
|
|
rename, return, run-mode, save, select, set-enc, |
111
|
|
|
|
|
|
|
set-standalone, skip-dtd, sort, stream, strip-whitespace, |
112
|
|
|
|
|
|
|
switch-to-new-documents, test-mode, throw, try, undef, unfold, |
113
|
|
|
|
|
|
|
unless, unregister-function, unregister-namespace, valid, |
114
|
|
|
|
|
|
|
validate, validation, variables, verbose, version, while, |
115
|
|
|
|
|
|
|
xcopy, xinsert, xmove, xpath-axis-completion, |
116
|
|
|
|
|
|
|
xpath-completion, xslt, xupdate |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
END |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
$HELP{'command-block'}=[<<'END']; |
122
|
|
|
|
|
|
|
command-block argument type |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
description: |
125
|
|
|
|
|
|
|
XSH command or a block of semicolon-separated commands |
126
|
|
|
|
|
|
|
enclosed within curly brackets. |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
Example: Count paragraphs in each chapter |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
$i=0; |
131
|
|
|
|
|
|
|
foreach //chapter { |
132
|
|
|
|
|
|
|
$c=count(./para); |
133
|
|
|
|
|
|
|
$i=$i+1; |
134
|
|
|
|
|
|
|
print "$c paragraphs in chapter no.$i"; |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
END |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
$HELP{'type'}=[<<'END']; |
141
|
|
|
|
|
|
|
List of command argument types |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
description: |
144
|
|
|
|
|
|
|
command-block, enc-string, expression, filename, id, location, |
145
|
|
|
|
|
|
|
node-type, perl-code, xpath |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
END |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
$HELP{'expression'}=[<<'END']; |
151
|
|
|
|
|
|
|
expression argument type |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
description: |
154
|
|
|
|
|
|
|
Expression is a string consisting of unquoted characters other |
155
|
|
|
|
|
|
|
than whitespace or semicolon, single quote or double quote |
156
|
|
|
|
|
|
|
characters or quoted characters of any kind (but see also |
157
|
|
|
|
|
|
|
special case of expression - so called here-documents - |
158
|
|
|
|
|
|
|
described below). Quoting means either preceding a single |
159
|
|
|
|
|
|
|
character with a backslash or enclosing a part of the string |
160
|
|
|
|
|
|
|
into single quotes '...' or double quotes "...". Quoting |
161
|
|
|
|
|
|
|
characters are removed from the string so they must be quoted |
162
|
|
|
|
|
|
|
themselves if they are a part of the expression: \\, \' or " ' |
163
|
|
|
|
|
|
|
", \" or ' " '. Unquoted (sub)expressons and (sub)expressions |
164
|
|
|
|
|
|
|
quoted with double-quotes are subject to variable, Perl, and |
165
|
|
|
|
|
|
|
XPath expansions. |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
Variable expansion replaces substrings of the form $id or |
168
|
|
|
|
|
|
|
${id} with the value of the variable named $id, unless the '$' |
169
|
|
|
|
|
|
|
sign is quoted. |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
Perl expansion evaluates every substring enclosed in between |
172
|
|
|
|
|
|
|
`${{{' and `}}}' as a Perl expresson (in very much the same |
173
|
|
|
|
|
|
|
way as the command) and replaces the whole thing with |
174
|
|
|
|
|
|
|
the resulting value. |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
XPath interpolation evaluates every substring enclosed in |
177
|
|
|
|
|
|
|
between `${{' and `}}' as an XPath expression (in very much |
178
|
|
|
|
|
|
|
the same way as the command) and substitutes the whole |
179
|
|
|
|
|
|
|
thing with the resul. |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
For convenience, another kind XPath interpolation is performed |
182
|
|
|
|
|
|
|
on expressions. It replaces any substring occuring between |
183
|
|
|
|
|
|
|
`${(' and `)}' with a literal result of XPath evaluation of |
184
|
|
|
|
|
|
|
the string. This means, that if the evaluation results in a |
185
|
|
|
|
|
|
|
node-list, the textual content of its first node is |
186
|
|
|
|
|
|
|
substituted rather than the number of nodes in the node-list |
187
|
|
|
|
|
|
|
(as with `${{ ... }}'). |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
Example: |
190
|
|
|
|
|
|
|
echo foo "bar" # prints: foo bar |
191
|
|
|
|
|
|
|
echo foo"bar" # prints: foobar |
192
|
|
|
|
|
|
|
echo foo'"bar"' # prints: foo"bar" |
193
|
|
|
|
|
|
|
echo foo"'b\\a\"r'" # prints: foo'b\a"r' |
194
|
|
|
|
|
|
|
$a="bar" |
195
|
|
|
|
|
|
|
echo foo$a # prints: foobar |
196
|
|
|
|
|
|
|
echo foo\$a # prints: foo$a |
197
|
|
|
|
|
|
|
echo '$a' # prints: '$a' |
198
|
|
|
|
|
|
|
echo "'$a'" # prints: 'bar' |
199
|
|
|
|
|
|
|
echo "${{//middle-earth/creatures}}" # prints: 10 |
200
|
|
|
|
|
|
|
echo '${{//middle-earth/creatures}}' # prints: ${{//middle-earth/creatures}} |
201
|
|
|
|
|
|
|
echo ${{//creature[1]/@name}} # !!! prints: 1 |
202
|
|
|
|
|
|
|
echo ${(//creature[1]/@name)} # prints: Bilbo |
203
|
|
|
|
|
|
|
echo ${{{ join(",",split(//,$a)) }}} # prints: b,a,r |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
There is one more special type of expressions, so called |
206
|
|
|
|
|
|
|
``here-documents'' following syntax of similar constructs in |
207
|
|
|
|
|
|
|
Bash and Perl. Following a `<<' you specify a string to |
208
|
|
|
|
|
|
|
terminate the quoted material, and all lines following the |
209
|
|
|
|
|
|
|
current line down to the terminating string are the value of |
210
|
|
|
|
|
|
|
the expression. The terminating string is either quoted or |
211
|
|
|
|
|
|
|
unquoted identifier (a word). If quoted, the type of quotes |
212
|
|
|
|
|
|
|
you use determines the treatment of the text, just as in |
213
|
|
|
|
|
|
|
regular quoting, i.e. in case of double quotes, the material |
214
|
|
|
|
|
|
|
contained in the here-document is subject to variable, Perl, |
215
|
|
|
|
|
|
|
and XPath expansions. An unquoted identifier works just like |
216
|
|
|
|
|
|
|
double quotes. There must be no space between the `<<' and the |
217
|
|
|
|
|
|
|
identifier. The terminating string must appear by itself |
218
|
|
|
|
|
|
|
(unquoted and with no surrounding whitespace) on the |
219
|
|
|
|
|
|
|
terminating line. |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
Example: |
222
|
|
|
|
|
|
|
$a="bar" |
223
|
|
|
|
|
|
|
echo foo <
|
224
|
|
|
|
|
|
|
xx $a yy |
225
|
|
|
|
|
|
|
END |
226
|
|
|
|
|
|
|
# prints foo xx bar yy baz |
227
|
|
|
|
|
|
|
echo foo <<"END" baz; |
228
|
|
|
|
|
|
|
xx $a yy |
229
|
|
|
|
|
|
|
END |
230
|
|
|
|
|
|
|
# same as above |
231
|
|
|
|
|
|
|
echo foo <<'END' baz; |
232
|
|
|
|
|
|
|
xx $a yy |
233
|
|
|
|
|
|
|
END |
234
|
|
|
|
|
|
|
# prints foo xx $a yy baz |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
END |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
|
239
|
|
|
|
|
|
|
$HELP{'enc-string'}=[<<'END']; |
240
|
|
|
|
|
|
|
enc_string argument type |
241
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
description: |
243
|
|
|
|
|
|
|
An which interpolates to a valid encoding string, |
244
|
|
|
|
|
|
|
e.g. to utf-8, utf-16, iso-8859-1, iso-8859-2, windows-1250 |
245
|
|
|
|
|
|
|
etc. |
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
END |
248
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
$HELP{'id'}=[<<'END']; |
251
|
|
|
|
|
|
|
id argument type |
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
description: |
254
|
|
|
|
|
|
|
An identifier, that is, a string beginning with a letter or |
255
|
|
|
|
|
|
|
underscore, and containing letters, underscores, and digits. |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
END |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
$HELP{'filename'}=[<<'END']; |
261
|
|
|
|
|
|
|
Filename argument type |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
description: |
264
|
|
|
|
|
|
|
An which interpolates to a valid file name or |
265
|
|
|
|
|
|
|
URL. |
266
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
END |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
$HELP{'xpath'}=[<<'END']; |
271
|
|
|
|
|
|
|
XPath argument type |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
description: |
274
|
|
|
|
|
|
|
XSH supports arbitrary XPath expression as defined in W3C |
275
|
|
|
|
|
|
|
recommendation at http://www.w3.org/TR/xpath. (Nice |
276
|
|
|
|
|
|
|
interactive XPath tutorials and references can be found at |
277
|
|
|
|
|
|
|
http://www.zvon.org.) In XSH, XPath expressoin may be |
278
|
|
|
|
|
|
|
optionally preceded with a document identifier followed by |
279
|
|
|
|
|
|
|
colon (:xpath). If no document identifier is given, the |
280
|
|
|
|
|
|
|
current document is used. |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
As an extension, the following XPath extension functions are |
283
|
|
|
|
|
|
|
defined in the XSH namespace: |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
`xsh:doc(id-string)' - returns a nodelist consisting of the |
286
|
|
|
|
|
|
|
document node associated in XSH with an identifier given in |
287
|
|
|
|
|
|
|
`id-string'. |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
`xsh:matches(match-string,regexp-string)' - returns `true' if |
290
|
|
|
|
|
|
|
`match-string' matches the regular expression given in |
291
|
|
|
|
|
|
|
`regexp-string'. Otherwise returns `false'. |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
`xsh:grep(node-set, regexp-string)' - returns a node set |
294
|
|
|
|
|
|
|
consisting of nodes of the given `node-set' whose content (as |
295
|
|
|
|
|
|
|
returned by the built-in XPath function `string()') matches |
296
|
|
|
|
|
|
|
the regular expression given in `regexp-string'. |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
`xsh:same(node-set1, node-set2)' - returns `true' if the given |
299
|
|
|
|
|
|
|
node sets both contain the same node (in XPath, this can also |
300
|
|
|
|
|
|
|
be expressed as |
301
|
|
|
|
|
|
|
`count(node-set1|node-set2)+count(node-set1)+count(node-set2)= |
302
|
|
|
|
|
|
|
1'). |
303
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
Example: Open a document and count all sections containing a subsection |
305
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
xsh scratch:/> open v = mydocument1.xml; |
307
|
|
|
|
|
|
|
xsh v:/> open k = mydocument2.xml; |
308
|
|
|
|
|
|
|
xsh k:/> count //section[subsection]; # searches k |
309
|
|
|
|
|
|
|
xsh k:/> count v://section[subsection]; # searches v |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
END |
312
|
|
|
|
|
|
|
|
313
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
$HELP{'try'}=[<<'END']; |
315
|
|
|
|
|
|
|
usage: try catch [[local] $] |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
description: |
318
|
|
|
|
|
|
|
Execute following the `try' keyword. If an |
319
|
|
|
|
|
|
|
error or exception occures during the evaluation, execute the |
320
|
|
|
|
|
|
|
`catch' . If a variable follows `catch' and the |
321
|
|
|
|
|
|
|
`try' block fails, an error message of the exception occured |
322
|
|
|
|
|
|
|
is stored to the variable before the `catch' block is |
323
|
|
|
|
|
|
|
executed. Optionally, the variable name may be preceded with |
324
|
|
|
|
|
|
|
the keyword `local' in order to make the assignment local to |
325
|
|
|
|
|
|
|
the `catch' block (see ). |
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
The command and the equivalent perl construction `perl |
328
|
|
|
|
|
|
|
{ die "error message" }' allow user to throw custom |
329
|
|
|
|
|
|
|
exceptions. |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
Example: Handle parse errors |
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
try { |
334
|
|
|
|
|
|
|
open XML doc=$input; |
335
|
|
|
|
|
|
|
} catch { |
336
|
|
|
|
|
|
|
try { |
337
|
|
|
|
|
|
|
echo "XML parser failed, trying HTML"; |
338
|
|
|
|
|
|
|
open HTML doc=$input; |
339
|
|
|
|
|
|
|
} catch local $error { |
340
|
|
|
|
|
|
|
echo "Stopping due to errors: $error"; |
341
|
|
|
|
|
|
|
exit 1; |
342
|
|
|
|
|
|
|
} |
343
|
|
|
|
|
|
|
} |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
see also: throw |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
END |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
$HELP{'if'}=[<<'END']; |
351
|
|
|
|
|
|
|
usage: if | |
352
|
|
|
|
|
|
|
if | |
353
|
|
|
|
|
|
|
[ elsif ]* [ else ] |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
description: |
356
|
|
|
|
|
|
|
Execute if a given or |
357
|
|
|
|
|
|
|
expression evaluates to a non-emtpty node-list, true |
358
|
|
|
|
|
|
|
boolean-value, non-zero number or non-empty literal. If the |
359
|
|
|
|
|
|
|
first test fails, check all possibly following `elsif' |
360
|
|
|
|
|
|
|
conditions and execute the corresponding for |
361
|
|
|
|
|
|
|
the first one of them which is true. If none of them succeeds, |
362
|
|
|
|
|
|
|
execute the `else' (if any). |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
Example: Display node type |
365
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
def node_type %n { |
367
|
|
|
|
|
|
|
foreach (%n) { |
368
|
|
|
|
|
|
|
if ( . = self::* ) { # XPath trick to check if . is an element |
369
|
|
|
|
|
|
|
echo 'element'; |
370
|
|
|
|
|
|
|
} elsif ( . = ../@* ) { # XPath trick to check if . is an attribute |
371
|
|
|
|
|
|
|
echo 'attribute'; |
372
|
|
|
|
|
|
|
} elsif ( . = ../processing-instruction() ) { |
373
|
|
|
|
|
|
|
echo 'pi'; |
374
|
|
|
|
|
|
|
} elsif ( . = ../text() ) { |
375
|
|
|
|
|
|
|
echo 'text'; |
376
|
|
|
|
|
|
|
} elsif ( . = ../comment() ) { |
377
|
|
|
|
|
|
|
echo 'comment' |
378
|
|
|
|
|
|
|
} else { # well, this should not happen, but anyway, ... |
379
|
|
|
|
|
|
|
echo 'unknown-type'; |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
} |
382
|
|
|
|
|
|
|
} |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
END |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
$HELP{'unless'}=[<<'END']; |
388
|
|
|
|
|
|
|
usage: unless | |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
unless | |
391
|
|
|
|
|
|
|
[ else ] |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
description: |
394
|
|
|
|
|
|
|
Like if but negating the result of the expression. |
395
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
see also: if |
397
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
END |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
$HELP{'while'}=[<<'END']; |
402
|
|
|
|
|
|
|
usage: while | |
403
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
description: |
405
|
|
|
|
|
|
|
Execute as long as the given or |
406
|
|
|
|
|
|
|
expression evaluates to a non-emtpty node-list, |
407
|
|
|
|
|
|
|
true boolean-value, non-zero number or non-empty literal. |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
Example: The commands have the same results |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
xsh> while /table/row remove /table/row[1]; |
412
|
|
|
|
|
|
|
xsh> remove /table/row; |
413
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
END |
415
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
|
417
|
|
|
|
|
|
|
$HELP{'foreach'}=[<<'END']; |
418
|
|
|
|
|
|
|
usage: foreach | |
419
|
|
|
|
|
|
|
| |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
aliases: for |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
description: |
424
|
|
|
|
|
|
|
If the first argument is an expression, execute the |
425
|
|
|
|
|
|
|
command-block for each node matching the expression making it |
426
|
|
|
|
|
|
|
temporarily the current node, so that all relative XPath |
427
|
|
|
|
|
|
|
expressions are evaluated in its context. |
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
If the first argument is a , it is evaluated and |
430
|
|
|
|
|
|
|
the resulting perl-list is iterated setting the variable $__ |
431
|
|
|
|
|
|
|
(note that there are two underscores!) to be each element of |
432
|
|
|
|
|
|
|
the list in turn. It works much like perl's foreach, except |
433
|
|
|
|
|
|
|
that the variable used consists of two underscores. |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
Example: Move all employee elements in a company element into a staff |
436
|
|
|
|
|
|
|
subelement of the same company |
437
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
xsh> foreach //company xmove ./employee into ./staff; |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
Example: List content of all XML files in current directory |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
xsh> foreach { glob('*.xml') } { open f=$__; list f:/; } |
443
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
END |
445
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
$HELP{'for'}=$HELP{'foreach'}; |
447
|
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
$HELP{'undef'}=[<<'END']; |
449
|
|
|
|
|
|
|
usage: undef |
450
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
aliases: undefine |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
description: |
454
|
|
|
|
|
|
|
This command can be used to undefine previously defined XSH |
455
|
|
|
|
|
|
|
subroutines. The is evaluated as a Perl regular |
456
|
|
|
|
|
|
|
expression. All subroutines whose names match are undefined. |
457
|
|
|
|
|
|
|
Note, that like `def', all `undef' commands are processed |
458
|
|
|
|
|
|
|
during the compilation of the source code, not at run-time, so |
459
|
|
|
|
|
|
|
it doesn't matter how deep in the code is a `undef' command |
460
|
|
|
|
|
|
|
nested. |
461
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
Example: |
463
|
|
|
|
|
|
|
xsh> include my_defs.xsh |
464
|
|
|
|
|
|
|
xsh> call my_sub1 //foo; |
465
|
|
|
|
|
|
|
xsh> call my_sub2 //bar; |
466
|
|
|
|
|
|
|
xsh> undefine 'my_sub.*' |
467
|
|
|
|
|
|
|
xsh> # change/edit the definitions in my_defs.xsh and reload |
468
|
|
|
|
|
|
|
xsh> include my_defs.xsh |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
END |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
$HELP{'undefine'}=$HELP{'undef'}; |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
$HELP{'def'}=[<<'END']; |
475
|
|
|
|
|
|
|
usage: def [$ | %]* |
476
|
|
|
|
|
|
|
or |
477
|
|
|
|
|
|
|
def [$ | %]*; |
478
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
aliases: define |
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
description: |
482
|
|
|
|
|
|
|
Define a new XSH subroutine named . The subroutine may |
483
|
|
|
|
|
|
|
require zero or more parameters of nodelist or string type. |
484
|
|
|
|
|
|
|
These are declared as a whitespace-separated list of (so |
485
|
|
|
|
|
|
|
called) parametric variables (of nodelist or string type). The |
486
|
|
|
|
|
|
|
body of the subroutine is specified as a . |
487
|
|
|
|
|
|
|
Note, that all subroutine declarations are processed during |
488
|
|
|
|
|
|
|
the parsing and not at run-time, so it does not matter where |
489
|
|
|
|
|
|
|
the subroutine is defined. |
490
|
|
|
|
|
|
|
|
491
|
|
|
|
|
|
|
The routine can be later invoked using the command |
492
|
|
|
|
|
|
|
followed by the routine name and parameters. Nodelist |
493
|
|
|
|
|
|
|
parameters must be given as an XPath expressions, and are |
494
|
|
|
|
|
|
|
evaluated just before the subroutine's body is executed. |
495
|
|
|
|
|
|
|
String parameters must be given as (string) s. |
496
|
|
|
|
|
|
|
Resulting node-lists/strings are stored into the parametric |
497
|
|
|
|
|
|
|
variables before the body is executed. These variables are |
498
|
|
|
|
|
|
|
local to the subroutine's call tree (see also the |
499
|
|
|
|
|
|
|
command). If there is a global variable using the same name as |
500
|
|
|
|
|
|
|
some parametric variable, the original value of the global |
501
|
|
|
|
|
|
|
variable is replaced with the value of the parametric variable |
502
|
|
|
|
|
|
|
for the time of the subroutine's run-time. |
503
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
Note that subroutine has to be declared before it is called |
505
|
|
|
|
|
|
|
with . If you cannot do so, e.g. if you want to call a |
506
|
|
|
|
|
|
|
subroutine recursively, you have to pre-declare the subroutine |
507
|
|
|
|
|
|
|
using a `def' with no . There may be only one |
508
|
|
|
|
|
|
|
full declaration (and possibly one pre-declaration) of a |
509
|
|
|
|
|
|
|
subroutine for one and the declaration and |
510
|
|
|
|
|
|
|
pre-declaration has to define the same number of arguments and |
511
|
|
|
|
|
|
|
their types must match. |
512
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
Example: |
514
|
|
|
|
|
|
|
def l3 %v { |
515
|
|
|
|
|
|
|
ls %v 3; # list given nodes upto depth 3 |
516
|
|
|
|
|
|
|
} |
517
|
|
|
|
|
|
|
call l3 //chapter; |
518
|
|
|
|
|
|
|
|
519
|
|
|
|
|
|
|
Example: Commenting and un-commenting pieces of document |
520
|
|
|
|
|
|
|
|
521
|
|
|
|
|
|
|
def comment |
522
|
|
|
|
|
|
|
%n # nodes to move to comments |
523
|
|
|
|
|
|
|
$mark # maybe some handy mark to recognize such comments |
524
|
|
|
|
|
|
|
{ |
525
|
|
|
|
|
|
|
foreach %n { |
526
|
|
|
|
|
|
|
if ( . = ../@* ) { |
527
|
|
|
|
|
|
|
echo "Warning: attribute nodes are not supported!"; |
528
|
|
|
|
|
|
|
} else { |
529
|
|
|
|
|
|
|
echo "Commenting out:"; |
530
|
|
|
|
|
|
|
ls .; |
531
|
|
|
|
|
|
|
local $node = ""; |
532
|
|
|
|
|
|
|
ls . |> $node; |
533
|
|
|
|
|
|
|
add comment "$mark$node" replace .; |
534
|
|
|
|
|
|
|
} |
535
|
|
|
|
|
|
|
} |
536
|
|
|
|
|
|
|
} |
537
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
def uncomment %n $mark { |
539
|
|
|
|
|
|
|
foreach %n { |
540
|
|
|
|
|
|
|
if (. = ../comment()) { # is this node a comment node |
541
|
|
|
|
|
|
|
local $string = substring-after(.,"$mark"); |
542
|
|
|
|
|
|
|
add chunk $string replace .; |
543
|
|
|
|
|
|
|
} else { |
544
|
|
|
|
|
|
|
echo "Warning: Ignoring non-comment node:"; |
545
|
|
|
|
|
|
|
ls . 0; |
546
|
|
|
|
|
|
|
} |
547
|
|
|
|
|
|
|
} |
548
|
|
|
|
|
|
|
} |
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
|
551
|
|
|
|
|
|
|
# comment out all chapters with no paragraphs |
552
|
|
|
|
|
|
|
call comment //chapter[not(para)] "COMMENT-NOPARA"; |
553
|
|
|
|
|
|
|
|
554
|
|
|
|
|
|
|
# uncomment all comments (may not always be valid!) |
555
|
|
|
|
|
|
|
$mark="COMMENT-NOPARA"; |
556
|
|
|
|
|
|
|
call uncomment //comment()[starts-with(.,"$mark")] $mark; |
557
|
|
|
|
|
|
|
|
558
|
|
|
|
|
|
|
see also: call return local |
559
|
|
|
|
|
|
|
|
560
|
|
|
|
|
|
|
END |
561
|
|
|
|
|
|
|
|
562
|
|
|
|
|
|
|
$HELP{'define'}=$HELP{'def'}; |
563
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
$HELP{'assign'}=[<<'END']; |
565
|
|
|
|
|
|
|
usage: assign $= |
566
|
|
|
|
|
|
|
$= |
567
|
|
|
|
|
|
|
assign %= |
568
|
|
|
|
|
|
|
%= |
569
|
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
description: |
571
|
|
|
|
|
|
|
In the first two cases (where dollar sign appears) store the |
572
|
|
|
|
|
|
|
result of evaluation of the in a variable named $. |
573
|
|
|
|
|
|
|
In this case, is evaluated in a simmilar way as in the |
574
|
|
|
|
|
|
|
case of the : if it results in a literal value this |
575
|
|
|
|
|
|
|
value is used. If it results in a node-list, number of nodes |
576
|
|
|
|
|
|
|
occuring in that node-list is used. Use the `string()' XPath |
577
|
|
|
|
|
|
|
function to obtain a literal values in these cases. |
578
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
Example: String expressions |
580
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
xsh> $a=string(chapter/title) |
582
|
|
|
|
|
|
|
xsh> $b="hallo world" |
583
|
|
|
|
|
|
|
|
584
|
|
|
|
|
|
|
Example: Arithmetic expressions |
585
|
|
|
|
|
|
|
|
586
|
|
|
|
|
|
|
xsh> $a=5*100 |
587
|
|
|
|
|
|
|
xsh> $a |
588
|
|
|
|
|
|
|
$a=500 |
589
|
|
|
|
|
|
|
xsh> $a=(($a+5) div 10) |
590
|
|
|
|
|
|
|
xsh> $a |
591
|
|
|
|
|
|
|
$a=50.5 |
592
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
Example: Counting nodes |
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
xsh> $a=//chapter |
596
|
|
|
|
|
|
|
xsh> $a |
597
|
|
|
|
|
|
|
$a=10 |
598
|
|
|
|
|
|
|
xsh> %chapters=//chapter |
599
|
|
|
|
|
|
|
xsh> $a=%chapters |
600
|
|
|
|
|
|
|
xsh> $a |
601
|
|
|
|
|
|
|
$a=10 |
602
|
|
|
|
|
|
|
|
603
|
|
|
|
|
|
|
Example: Some caveats of counting node-lists |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
xsh> ls ./creature |
606
|
|
|
|
|
|
|
|
607
|
|
|
|
|
|
|
|
608
|
|
|
|
|
|
|
## WRONG (@name results in a singleton node-list) !!! |
609
|
|
|
|
|
|
|
xsh> $name=@name |
610
|
|
|
|
|
|
|
xsh> $name |
611
|
|
|
|
|
|
|
$name=1 |
612
|
|
|
|
|
|
|
|
613
|
|
|
|
|
|
|
## CORRECT (use string() function) |
614
|
|
|
|
|
|
|
xsh> $name=string(@name) |
615
|
|
|
|
|
|
|
xsh> $name |
616
|
|
|
|
|
|
|
$name=Bilbo |
617
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
In the other two cases (where percent sign appears) find all |
619
|
|
|
|
|
|
|
nodes matching a given and store the resulting |
620
|
|
|
|
|
|
|
node-list in the variable named %. The variable may be |
621
|
|
|
|
|
|
|
later used instead of an XPath expression. |
622
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
see also: variables |
624
|
|
|
|
|
|
|
|
625
|
|
|
|
|
|
|
END |
626
|
|
|
|
|
|
|
|
627
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
$HELP{'local'}=[<<'END']; |
629
|
|
|
|
|
|
|
usage: local $ = |
630
|
|
|
|
|
|
|
local % = |
631
|
|
|
|
|
|
|
local $|% [ $|% ... ] |
632
|
|
|
|
|
|
|
|
633
|
|
|
|
|
|
|
description: |
634
|
|
|
|
|
|
|
This command acts in a very similar way as does, |
635
|
|
|
|
|
|
|
except that the variable assignment is done temporarily and |
636
|
|
|
|
|
|
|
lasts only for the rest of the nearest enclosing |
637
|
|
|
|
|
|
|
. At the end of the enclosing block or |
638
|
|
|
|
|
|
|
subroutine the original value is restored. This command may |
639
|
|
|
|
|
|
|
also be used without the assignment part and assignments may |
640
|
|
|
|
|
|
|
be done later using the usual command. |
641
|
|
|
|
|
|
|
|
642
|
|
|
|
|
|
|
Note, that the variable itself is not lexically is still |
643
|
|
|
|
|
|
|
global in the sense that it is still visible to any subroutine |
644
|
|
|
|
|
|
|
called subsequently from within the same block. A local just |
645
|
|
|
|
|
|
|
gives temporary values to global (meaning package) variables. |
646
|
|
|
|
|
|
|
Unlike Perl's `my' declarations it does not create a local |
647
|
|
|
|
|
|
|
variable. This is known as dynamic scoping. Lexical scoping is |
648
|
|
|
|
|
|
|
not implemented in XSH. |
649
|
|
|
|
|
|
|
|
650
|
|
|
|
|
|
|
To sum up for Perl programmers: `local' in XSH works exactly |
651
|
|
|
|
|
|
|
the same as `local' in Perl. |
652
|
|
|
|
|
|
|
|
653
|
|
|
|
|
|
|
see also: assign def |
654
|
|
|
|
|
|
|
|
655
|
|
|
|
|
|
|
END |
656
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
|
658
|
|
|
|
|
|
|
$HELP{'options'}=[<<'END']; |
659
|
|
|
|
|
|
|
usage: options |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
aliases: flags |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
description: |
664
|
|
|
|
|
|
|
List current values of all XSH flags and options (such as |
665
|
|
|
|
|
|
|
validation flag or query-encoding). |
666
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
Example: Store current settings in your .xshrc |
668
|
|
|
|
|
|
|
|
669
|
|
|
|
|
|
|
xsh> options | cat > ~/.xshrc |
670
|
|
|
|
|
|
|
|
671
|
|
|
|
|
|
|
END |
672
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
$HELP{'flags'}=$HELP{'options'}; |
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
$HELP{'defs'}=[<<'END']; |
676
|
|
|
|
|
|
|
usage: defs |
677
|
|
|
|
|
|
|
|
678
|
|
|
|
|
|
|
description: |
679
|
|
|
|
|
|
|
List names and parametric variables for all defined XSH |
680
|
|
|
|
|
|
|
routines. |
681
|
|
|
|
|
|
|
|
682
|
|
|
|
|
|
|
see also: def variables |
683
|
|
|
|
|
|
|
|
684
|
|
|
|
|
|
|
END |
685
|
|
|
|
|
|
|
|
686
|
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
$HELP{'ifinclude'}=[<<'END']; |
688
|
|
|
|
|
|
|
usage: ifinclude |
689
|
|
|
|
|
|
|
|
690
|
|
|
|
|
|
|
description: |
691
|
|
|
|
|
|
|
Include a file named and execute all XSH commands |
692
|
|
|
|
|
|
|
therein unless the file was already included using either |
693
|
|
|
|
|
|
|
of . |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
see also: include |
696
|
|
|
|
|
|
|
|
697
|
|
|
|
|
|
|
END |
698
|
|
|
|
|
|
|
|
699
|
|
|
|
|
|
|
|
700
|
|
|
|
|
|
|
$HELP{'include'}=[<<'END']; |
701
|
|
|
|
|
|
|
usage: include |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
aliases: . |
704
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
description: |
706
|
|
|
|
|
|
|
Include a file named and execute all XSH commands |
707
|
|
|
|
|
|
|
therein. |
708
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
see also: ifinclude |
710
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
END |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
$HELP{'.'}=$HELP{'include'}; |
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
$HELP{'call'}=[<<'END']; |
716
|
|
|
|
|
|
|
usage: call [ | ]* |
717
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
description: |
719
|
|
|
|
|
|
|
Call an XSH subroutine named previously created using |
720
|
|
|
|
|
|
|
def. If the subroutine requires some paramters, these have to |
721
|
|
|
|
|
|
|
be specified after the . Node-list parameters are given by |
722
|
|
|
|
|
|
|
means of expressions. String parameters have to be |
723
|
|
|
|
|
|
|
string s. |
724
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
see also: def return |
726
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
END |
728
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
|
730
|
|
|
|
|
|
|
$HELP{'help'}=[<<'END']; |
731
|
|
|
|
|
|
|
usage: help |argument-type |
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
aliases: ? |
734
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
description: |
736
|
|
|
|
|
|
|
Print help on a given command or argument type. |
737
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
END |
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
$HELP{'?'}=$HELP{'help'}; |
741
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
$HELP{'exec'}=[<<'END']; |
743
|
|
|
|
|
|
|
usage: exec [ ...] |
744
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
aliases: system |
746
|
|
|
|
|
|
|
|
747
|
|
|
|
|
|
|
description: |
748
|
|
|
|
|
|
|
execute the system command(s) in s. |
749
|
|
|
|
|
|
|
|
750
|
|
|
|
|
|
|
Example: Count words in "hallo wold" string, then print name of your |
751
|
|
|
|
|
|
|
machine's operating system. |
752
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
exec echo hallo world; # prints hallo world |
754
|
|
|
|
|
|
|
exec "echo hallo word" | wc; # counts words in hallo world |
755
|
|
|
|
|
|
|
exec uname; # prints operating system name |
756
|
|
|
|
|
|
|
|
757
|
|
|
|
|
|
|
END |
758
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
$HELP{'system'}=$HELP{'exec'}; |
760
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
$HELP{'xslt'}=[<<'END']; |
762
|
|
|
|
|
|
|
usage: xslt [(params|parameters) name= [name= ...]] |
763
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
aliases: transform xsl xsltproc process |
765
|
|
|
|
|
|
|
|
766
|
|
|
|
|
|
|
description: |
767
|
|
|
|
|
|
|
Load an XSLT stylesheet from a file and use it to transform |
768
|
|
|
|
|
|
|
the document of the first into a new document named . |
769
|
|
|
|
|
|
|
Parameters may be passed to a stylesheet after params keyword |
770
|
|
|
|
|
|
|
in the form of a list of name=value pairs where name is the |
771
|
|
|
|
|
|
|
parameter name and value is an interpolating to |
772
|
|
|
|
|
|
|
its value. The resulting value is interpretted by XSLT |
773
|
|
|
|
|
|
|
processor as an XPath expression so e.g. quotes surrounding a |
774
|
|
|
|
|
|
|
XPath string have to be quoted themselves to preveserve them |
775
|
|
|
|
|
|
|
during the XSH expression interpolation. |
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
Example: |
778
|
|
|
|
|
|
|
xslt src stylesheet.xsl rslt params font="'14pt'" color="'red'" |
779
|
|
|
|
|
|
|
|
780
|
|
|
|
|
|
|
END |
781
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
$HELP{'transform'}=$HELP{'xslt'}; |
783
|
|
|
|
|
|
|
$HELP{'xsl'}=$HELP{'xslt'}; |
784
|
|
|
|
|
|
|
$HELP{'xsltproc'}=$HELP{'xslt'}; |
785
|
|
|
|
|
|
|
$HELP{'process'}=$HELP{'xslt'}; |
786
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
$HELP{'documents'}=[<<'END']; |
788
|
|
|
|
|
|
|
usage: files |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
aliases: files docs |
791
|
|
|
|
|
|
|
|
792
|
|
|
|
|
|
|
description: |
793
|
|
|
|
|
|
|
List open files and their identifiers. |
794
|
|
|
|
|
|
|
|
795
|
|
|
|
|
|
|
see also: open close |
796
|
|
|
|
|
|
|
|
797
|
|
|
|
|
|
|
END |
798
|
|
|
|
|
|
|
|
799
|
|
|
|
|
|
|
$HELP{'files'}=$HELP{'documents'}; |
800
|
|
|
|
|
|
|
$HELP{'docs'}=$HELP{'documents'}; |
801
|
|
|
|
|
|
|
|
802
|
|
|
|
|
|
|
$HELP{'variables'}=[<<'END']; |
803
|
|
|
|
|
|
|
usage: variables |
804
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
aliases: vars var |
806
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
description: |
808
|
|
|
|
|
|
|
List all defined variables and their values. |
809
|
|
|
|
|
|
|
|
810
|
|
|
|
|
|
|
see also: documents defs |
811
|
|
|
|
|
|
|
|
812
|
|
|
|
|
|
|
END |
813
|
|
|
|
|
|
|
|
814
|
|
|
|
|
|
|
$HELP{'vars'}=$HELP{'variables'}; |
815
|
|
|
|
|
|
|
$HELP{'var'}=$HELP{'variables'}; |
816
|
|
|
|
|
|
|
|
817
|
|
|
|
|
|
|
$HELP{'copy'}=[<<'END']; |
818
|
|
|
|
|
|
|
usage: copy |
819
|
|
|
|
|
|
|
|
820
|
|
|
|
|
|
|
aliases: cp |
821
|
|
|
|
|
|
|
|
822
|
|
|
|
|
|
|
description: |
823
|
|
|
|
|
|
|
Copies nodes matching the first to the destinations |
824
|
|
|
|
|
|
|
determined by the directive relative to the second |
825
|
|
|
|
|
|
|
. If more than one node matches the first than |
826
|
|
|
|
|
|
|
it is copied to the position relative to the corresponding |
827
|
|
|
|
|
|
|
node matched by the second according to the order in |
828
|
|
|
|
|
|
|
which are nodes matched. Thus, the n'th node matching the |
829
|
|
|
|
|
|
|
first is copied to the location relative to the n'th |
830
|
|
|
|
|
|
|
node matching the second . |
831
|
|
|
|
|
|
|
|
832
|
|
|
|
|
|
|
The possible values for are: after, before, into, |
833
|
|
|
|
|
|
|
replace and cause copying the source nodes after, before, into |
834
|
|
|
|
|
|
|
(as the last child-node). the destination nodes. If replace |
835
|
|
|
|
|
|
|
is used, the source node is copied before the |
836
|
|
|
|
|
|
|
destination node and the destination node is removed. |
837
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
Some kind of type conversion is used when the types of the |
839
|
|
|
|
|
|
|
source and destination nodes are not equal. Thus, text, cdata, |
840
|
|
|
|
|
|
|
comment or processing instruction node data prepend, append or |
841
|
|
|
|
|
|
|
replace value of a destination attribute when copied |
842
|
|
|
|
|
|
|
before,after/into or instead (replace) an attribute, and vice |
843
|
|
|
|
|
|
|
versa. |
844
|
|
|
|
|
|
|
|
845
|
|
|
|
|
|
|
Attributes may be copied after, before or into some other |
846
|
|
|
|
|
|
|
attribute to append, prepend or replace the destination |
847
|
|
|
|
|
|
|
attribute value. They may also replace the destination |
848
|
|
|
|
|
|
|
attribute completely (both its name and value). To copy an |
849
|
|
|
|
|
|
|
attribute from one element to another, simply copy the |
850
|
|
|
|
|
|
|
attribute node into the destination element. |
851
|
|
|
|
|
|
|
|
852
|
|
|
|
|
|
|
Elements may be copied into other elements (which results in |
853
|
|
|
|
|
|
|
appending the child-list of the destination element), or |
854
|
|
|
|
|
|
|
before, after or instead (replace) other nodes of any type |
855
|
|
|
|
|
|
|
except attributes. |
856
|
|
|
|
|
|
|
|
857
|
|
|
|
|
|
|
Example: Replace living-thing elements in the document b with the |
858
|
|
|
|
|
|
|
coresponding creature elements of the document a. |
859
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
xsh> copy a://creature replace b://living-thing |
861
|
|
|
|
|
|
|
|
862
|
|
|
|
|
|
|
END |
863
|
|
|
|
|
|
|
|
864
|
|
|
|
|
|
|
$HELP{'cp'}=$HELP{'copy'}; |
865
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
$HELP{'xcopy'}=[<<'END']; |
867
|
|
|
|
|
|
|
usage: xcopy |
868
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
aliases: xcp |
870
|
|
|
|
|
|
|
|
871
|
|
|
|
|
|
|
description: |
872
|
|
|
|
|
|
|
xcopy is similar to , but copies *all* nodes matching |
873
|
|
|
|
|
|
|
the first to *all* destinations determined by the |
874
|
|
|
|
|
|
|
directive relative to the second . See |
875
|
|
|
|
|
|
|
for detailed description of `xcopy' arguments. |
876
|
|
|
|
|
|
|
|
877
|
|
|
|
|
|
|
Example: Copy all middle-earth creatures within the document a into |
878
|
|
|
|
|
|
|
every world of the document b. |
879
|
|
|
|
|
|
|
|
880
|
|
|
|
|
|
|
xsh> xcopy a:/middle-earth/creature into b://world |
881
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
END |
883
|
|
|
|
|
|
|
|
884
|
|
|
|
|
|
|
$HELP{'xcp'}=$HELP{'xcopy'}; |
885
|
|
|
|
|
|
|
|
886
|
|
|
|
|
|
|
$HELP{'lcd'}=[<<'END']; |
887
|
|
|
|
|
|
|
usage: lcd |
888
|
|
|
|
|
|
|
|
889
|
|
|
|
|
|
|
aliases: chdir |
890
|
|
|
|
|
|
|
|
891
|
|
|
|
|
|
|
description: |
892
|
|
|
|
|
|
|
Changes the filesystem working directory to , if |
893
|
|
|
|
|
|
|
possible. If is omitted, changes to the directory |
894
|
|
|
|
|
|
|
specified in HOME environment variable, if set; if not, |
895
|
|
|
|
|
|
|
changes to the directory specified by LOGDIR environment |
896
|
|
|
|
|
|
|
variable. |
897
|
|
|
|
|
|
|
|
898
|
|
|
|
|
|
|
END |
899
|
|
|
|
|
|
|
|
900
|
|
|
|
|
|
|
$HELP{'chdir'}=$HELP{'lcd'}; |
901
|
|
|
|
|
|
|
|
902
|
|
|
|
|
|
|
$HELP{'insert'}=[<<'END']; |
903
|
|
|
|
|
|
|
usage: insert [namespace ] |
904
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
aliases: add |
906
|
|
|
|
|
|
|
|
907
|
|
|
|
|
|
|
description: |
908
|
|
|
|
|
|
|
Works just like xadd, except that the new node is attached |
909
|
|
|
|
|
|
|
only the first node matched. |
910
|
|
|
|
|
|
|
|
911
|
|
|
|
|
|
|
see also: xinsert move xmove |
912
|
|
|
|
|
|
|
|
913
|
|
|
|
|
|
|
END |
914
|
|
|
|
|
|
|
|
915
|
|
|
|
|
|
|
$HELP{'add'}=$HELP{'insert'}; |
916
|
|
|
|
|
|
|
|
917
|
|
|
|
|
|
|
$HELP{'xinsert'}=[<<'END']; |
918
|
|
|
|
|
|
|
usage: xinsert [namespace ] |
919
|
|
|
|
|
|
|
|
920
|
|
|
|
|
|
|
aliases: xadd |
921
|
|
|
|
|
|
|
|
922
|
|
|
|
|
|
|
description: |
923
|
|
|
|
|
|
|
Use the to create a new node of a given |
924
|
|
|
|
|
|
|
in the relative to the given . |
925
|
|
|
|
|
|
|
|
926
|
|
|
|
|
|
|
For element nodes, the format of the should look |
927
|
|
|
|
|
|
|
like "". The `<' and `>' |
928
|
|
|
|
|
|
|
characters are optional. If no attributes are used, the |
929
|
|
|
|
|
|
|
expression may simply consist the element name. Note, that in |
930
|
|
|
|
|
|
|
the first case, the quotes are required since the expression |
931
|
|
|
|
|
|
|
contains spaces. |
932
|
|
|
|
|
|
|
|
933
|
|
|
|
|
|
|
Attribute nodes use the following syntax: "att-name='attvalue' |
934
|
|
|
|
|
|
|
[...]". |
935
|
|
|
|
|
|
|
|
936
|
|
|
|
|
|
|
For the other types of nodes (text, cdata, comments) the |
937
|
|
|
|
|
|
|
expression should contain the node's literal content. Again, |
938
|
|
|
|
|
|
|
it is necessary to quote all whitespace and special characters |
939
|
|
|
|
|
|
|
as in any expression argument. |
940
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
The argument should be one of: `after', `before', |
942
|
|
|
|
|
|
|
`into', `replace', `append' or `prepend'. See documentation of |
943
|
|
|
|
|
|
|
the argument type for more detail. |
944
|
|
|
|
|
|
|
|
945
|
|
|
|
|
|
|
The namespace is only valid for elements and |
946
|
|
|
|
|
|
|
attributes and must evaluate to the namespace URI. In that |
947
|
|
|
|
|
|
|
case, the element or attribute name must have a prefix. The |
948
|
|
|
|
|
|
|
created node is associated with a given namespace. |
949
|
|
|
|
|
|
|
|
950
|
|
|
|
|
|
|
Example: Append a new Hobbit element to the list of middle-earth |
951
|
|
|
|
|
|
|
creatures and name him Bilbo. |
952
|
|
|
|
|
|
|
|
953
|
|
|
|
|
|
|
xsh> xadd element "" \ |
954
|
|
|
|
|
|
|
into /middle-earth/creatures |
955
|
|
|
|
|
|
|
xsh> xadd attribute "name='Bilbo'" \ |
956
|
|
|
|
|
|
|
into /middle-earth/creatures/creature[@race='hobbit'][last()] |
957
|
|
|
|
|
|
|
|
958
|
|
|
|
|
|
|
see also: insert move xmove |
959
|
|
|
|
|
|
|
|
960
|
|
|
|
|
|
|
END |
961
|
|
|
|
|
|
|
|
962
|
|
|
|
|
|
|
$HELP{'xadd'}=$HELP{'xinsert'}; |
963
|
|
|
|
|
|
|
|
964
|
|
|
|
|
|
|
$HELP{'node-type'}=[<<'END']; |
965
|
|
|
|
|
|
|
Node-type argument type |
966
|
|
|
|
|
|
|
|
967
|
|
|
|
|
|
|
description: |
968
|
|
|
|
|
|
|
One of: element, attribute, text, cdata, comment, chunk and |
969
|
|
|
|
|
|
|
(EXPERIMENTALLY!) entity_reference. A chunk is a character |
970
|
|
|
|
|
|
|
string which forms a well-balanced peace of XML. |
971
|
|
|
|
|
|
|
|
972
|
|
|
|
|
|
|
Example: |
973
|
|
|
|
|
|
|
add element hobbit into //middle-earth/creatures; |
974
|
|
|
|
|
|
|
add attribute 'name="Bilbo"' into //middle-earth/creatures/hobbit[last()]; |
975
|
|
|
|
|
|
|
add chunk 'A small guy from Shire.' |
976
|
|
|
|
|
|
|
into //middle-earth/creatures; |
977
|
|
|
|
|
|
|
|
978
|
|
|
|
|
|
|
END |
979
|
|
|
|
|
|
|
|
980
|
|
|
|
|
|
|
|
981
|
|
|
|
|
|
|
$HELP{'location'}=[<<'END']; |
982
|
|
|
|
|
|
|
Location argument type |
983
|
|
|
|
|
|
|
|
984
|
|
|
|
|
|
|
description: |
985
|
|
|
|
|
|
|
One of: `after', `before', `into', `append', `prepend', |
986
|
|
|
|
|
|
|
`replace'. |
987
|
|
|
|
|
|
|
|
988
|
|
|
|
|
|
|
NOTE: XSH 1.6 introduces two new values for location argument: |
989
|
|
|
|
|
|
|
`append' and `prepend' and slighlty changes behavior of |
990
|
|
|
|
|
|
|
`after' and `before'! |
991
|
|
|
|
|
|
|
|
992
|
|
|
|
|
|
|
This argument is required by all commands that insert nodes to |
993
|
|
|
|
|
|
|
a document in some way to a destination described by an XPath |
994
|
|
|
|
|
|
|
expression. The meaning of the values listed above is supposed |
995
|
|
|
|
|
|
|
be obvious in most cases, however the exact semantics for |
996
|
|
|
|
|
|
|
location argument values depends on types of both the source |
997
|
|
|
|
|
|
|
node and the target node. |
998
|
|
|
|
|
|
|
|
999
|
|
|
|
|
|
|
`after/before' place the node right after/before the |
1000
|
|
|
|
|
|
|
destination node, except for when the destination node is a |
1001
|
|
|
|
|
|
|
document node or one of the source nodes is an attribute: If |
1002
|
|
|
|
|
|
|
the destination node is a document node, the source node is |
1003
|
|
|
|
|
|
|
attached to the end/beginning of the document (remember: there |
1004
|
|
|
|
|
|
|
is no "after/before a document"). If both the source and |
1005
|
|
|
|
|
|
|
destination nodes are attributes, then the source node is |
1006
|
|
|
|
|
|
|
simply attached to the element containing the destination node |
1007
|
|
|
|
|
|
|
(remember: there is no order on attribute nodes). If the |
1008
|
|
|
|
|
|
|
destination node is an attribute but the source node is of a |
1009
|
|
|
|
|
|
|
different type, then the textual content of the source node is |
1010
|
|
|
|
|
|
|
appended to the value of the destination attribute (i.e. in |
1011
|
|
|
|
|
|
|
this case after/before act just as append/prepend). |
1012
|
|
|
|
|
|
|
|
1013
|
|
|
|
|
|
|
`append/prepend' appends/prepends the source node to the |
1014
|
|
|
|
|
|
|
destination node. If the destination node can contain other |
1015
|
|
|
|
|
|
|
nodes (i.e. it is an element or a document node) then the |
1016
|
|
|
|
|
|
|
entire source node is attached to it. In case of other |
1017
|
|
|
|
|
|
|
destination node types, the textual content of the source node |
1018
|
|
|
|
|
|
|
is appended/prepended to the content of the destination node. |
1019
|
|
|
|
|
|
|
|
1020
|
|
|
|
|
|
|
`into' can also be used to place the source node to the end of |
1021
|
|
|
|
|
|
|
an element (in the same way as `append'), to attach an |
1022
|
|
|
|
|
|
|
attribute to an element, or, if the destination node is a text |
1023
|
|
|
|
|
|
|
node, cdata section, processing-instruction, attribute or |
1024
|
|
|
|
|
|
|
comment, to replace its textual content with the textual |
1025
|
|
|
|
|
|
|
content of the source node. |
1026
|
|
|
|
|
|
|
|
1027
|
|
|
|
|
|
|
`replace' replaces the entire destination node with the source |
1028
|
|
|
|
|
|
|
node except for the case when the destination node is an |
1029
|
|
|
|
|
|
|
attribute and the source node is not. In such a case only the |
1030
|
|
|
|
|
|
|
value of the destination attribute is replaced with the |
1031
|
|
|
|
|
|
|
textual content of the source node. Note also that document |
1032
|
|
|
|
|
|
|
node can never be replaced. |
1033
|
|
|
|
|
|
|
|
1034
|
|
|
|
|
|
|
END |
1035
|
|
|
|
|
|
|
|
1036
|
|
|
|
|
|
|
|
1037
|
|
|
|
|
|
|
$HELP{'move'}=[<<'END']; |
1038
|
|
|
|
|
|
|
usage: move |
1039
|
|
|
|
|
|
|
|
1040
|
|
|
|
|
|
|
aliases: mv |
1041
|
|
|
|
|
|
|
|
1042
|
|
|
|
|
|
|
description: |
1043
|
|
|
|
|
|
|
`move' command acts exactly like , except that it |
1044
|
|
|
|
|
|
|
removes the source nodes after a succesfull copy. Remember |
1045
|
|
|
|
|
|
|
that the moved nodes are actually different nodes from the |
1046
|
|
|
|
|
|
|
original ones (which may not be obvious when moving nodes |
1047
|
|
|
|
|
|
|
within a single document into locations that do not require |
1048
|
|
|
|
|
|
|
type conversion). So, after the move, the original nodes do |
1049
|
|
|
|
|
|
|
not exist neither in the document itself nor any nodelist |
1050
|
|
|
|
|
|
|
variable. |
1051
|
|
|
|
|
|
|
|
1052
|
|
|
|
|
|
|
See for more details on how the copies of the moved |
1053
|
|
|
|
|
|
|
nodes are created. |
1054
|
|
|
|
|
|
|
|
1055
|
|
|
|
|
|
|
see also: copy xmove insert xinsert |
1056
|
|
|
|
|
|
|
|
1057
|
|
|
|
|
|
|
END |
1058
|
|
|
|
|
|
|
|
1059
|
|
|
|
|
|
|
$HELP{'mv'}=$HELP{'move'}; |
1060
|
|
|
|
|
|
|
|
1061
|
|
|
|
|
|
|
$HELP{'xmove'}=[<<'END']; |
1062
|
|
|
|
|
|
|
usage: xmove |
1063
|
|
|
|
|
|
|
|
1064
|
|
|
|
|
|
|
aliases: xmv |
1065
|
|
|
|
|
|
|
|
1066
|
|
|
|
|
|
|
description: |
1067
|
|
|
|
|
|
|
Like , except that `xmove' removes the source nodes |
1068
|
|
|
|
|
|
|
after a succesfull copy. Remember that the moved nodes are |
1069
|
|
|
|
|
|
|
actually different nodes from the original ones (which may not |
1070
|
|
|
|
|
|
|
be obvious when moving nodes within a single document into |
1071
|
|
|
|
|
|
|
locations that do not require type conversion). So, after the |
1072
|
|
|
|
|
|
|
move, the original nodes do not exist neither in the document |
1073
|
|
|
|
|
|
|
itself nor any nodelist variable. |
1074
|
|
|
|
|
|
|
|
1075
|
|
|
|
|
|
|
See for more details on how the copies of the moved |
1076
|
|
|
|
|
|
|
nodes are created. |
1077
|
|
|
|
|
|
|
|
1078
|
|
|
|
|
|
|
The following example demonstrates how `xcopy' can be used to |
1079
|
|
|
|
|
|
|
get rid of HTML `' elements while preserving their |
1080
|
|
|
|
|
|
|
content. As an exercise, try to find out why simple `foreach |
1081
|
|
|
|
|
|
|
//font { xmove node() replace . }' would not work here. |
1082
|
|
|
|
|
|
|
|
1083
|
|
|
|
|
|
|
Example: Get rid of all tags |
1084
|
|
|
|
|
|
|
|
1085
|
|
|
|
|
|
|
while //font[1] { |
1086
|
|
|
|
|
|
|
foreach //font[1] { |
1087
|
|
|
|
|
|
|
xmove ./node() replace .; |
1088
|
|
|
|
|
|
|
} |
1089
|
|
|
|
|
|
|
} |
1090
|
|
|
|
|
|
|
|
1091
|
|
|
|
|
|
|
see also: xcopy move insert xinsert |
1092
|
|
|
|
|
|
|
|
1093
|
|
|
|
|
|
|
END |
1094
|
|
|
|
|
|
|
|
1095
|
|
|
|
|
|
|
$HELP{'xmv'}=$HELP{'xmove'}; |
1096
|
|
|
|
|
|
|
|
1097
|
|
|
|
|
|
|
$HELP{'clone'}=[<<'END']; |
1098
|
|
|
|
|
|
|
usage: clone = |
1099
|
|
|
|
|
|
|
|
1100
|
|
|
|
|
|
|
aliases: dup |
1101
|
|
|
|
|
|
|
|
1102
|
|
|
|
|
|
|
description: |
1103
|
|
|
|
|
|
|
Make a copy of the document identified by the following |
1104
|
|
|
|
|
|
|
the equal sign assigning it the identifier of the first . |
1105
|
|
|
|
|
|
|
|
1106
|
|
|
|
|
|
|
see also: open close enc documents |
1107
|
|
|
|
|
|
|
|
1108
|
|
|
|
|
|
|
END |
1109
|
|
|
|
|
|
|
|
1110
|
|
|
|
|
|
|
$HELP{'dup'}=$HELP{'clone'}; |
1111
|
|
|
|
|
|
|
|
1112
|
|
|
|
|
|
|
$HELP{'normalize'}=[<<'END']; |
1113
|
|
|
|
|
|
|
usage: normalize |
1114
|
|
|
|
|
|
|
|
1115
|
|
|
|
|
|
|
description: |
1116
|
|
|
|
|
|
|
`normalize' puts all text nodes in the full depth of the |
1117
|
|
|
|
|
|
|
sub-tree underneath each node selected by a given , |
1118
|
|
|
|
|
|
|
into a "normal" form where only structure (e.g., elements, |
1119
|
|
|
|
|
|
|
comments, processing instructions, CDATA sections, and entity |
1120
|
|
|
|
|
|
|
references) separates text nodes, i.e., there are neither |
1121
|
|
|
|
|
|
|
adjacent Text nodes nor empty Text nodes. |
1122
|
|
|
|
|
|
|
|
1123
|
|
|
|
|
|
|
END |
1124
|
|
|
|
|
|
|
|
1125
|
|
|
|
|
|
|
|
1126
|
|
|
|
|
|
|
$HELP{'strip-whitespace'}=[<<'END']; |
1127
|
|
|
|
|
|
|
usage: strip |
1128
|
|
|
|
|
|
|
|
1129
|
|
|
|
|
|
|
aliases: strip_whitespace |
1130
|
|
|
|
|
|
|
|
1131
|
|
|
|
|
|
|
description: |
1132
|
|
|
|
|
|
|
`strip-whitespace' removes all leading and trailing whitespace |
1133
|
|
|
|
|
|
|
from given nodes. If applied to an element node, it removes |
1134
|
|
|
|
|
|
|
all leading and trailing child text nodes and CDATA sections |
1135
|
|
|
|
|
|
|
that consist entirely of whitespace. |
1136
|
|
|
|
|
|
|
|
1137
|
|
|
|
|
|
|
END |
1138
|
|
|
|
|
|
|
|
1139
|
|
|
|
|
|
|
$HELP{'strip_whitespace'}=$HELP{'strip-whitespace'}; |
1140
|
|
|
|
|
|
|
|
1141
|
|
|
|
|
|
|
$HELP{'ls'}=[<<'END']; |
1142
|
|
|
|
|
|
|
usage: ls [] |
1143
|
|
|
|
|
|
|
|
1144
|
|
|
|
|
|
|
aliases: list |
1145
|
|
|
|
|
|
|
|
1146
|
|
|
|
|
|
|
description: |
1147
|
|
|
|
|
|
|
List the XML representation of all nodes matching . The |
1148
|
|
|
|
|
|
|
optional argument may be provided to specify the |
1149
|
|
|
|
|
|
|
depth of XML tree listing. If negative, the tree will be |
1150
|
|
|
|
|
|
|
listed to unlimited depth. If the results in the |
1151
|
|
|
|
|
|
|
word `fold', elements marked with the command are |
1152
|
|
|
|
|
|
|
folded, i.e. listed only to a certain depth (this feature is |
1153
|
|
|
|
|
|
|
still EXPERIMENTAL!). |
1154
|
|
|
|
|
|
|
|
1155
|
|
|
|
|
|
|
Unless in quiet mode, this command prints also number of nodes |
1156
|
|
|
|
|
|
|
matched on stderr. |
1157
|
|
|
|
|
|
|
|
1158
|
|
|
|
|
|
|
If the parameter is omitted, current context node is |
1159
|
|
|
|
|
|
|
listed to the depth of 1. |
1160
|
|
|
|
|
|
|
|
1161
|
|
|
|
|
|
|
see also: count fold unfold |
1162
|
|
|
|
|
|
|
|
1163
|
|
|
|
|
|
|
END |
1164
|
|
|
|
|
|
|
|
1165
|
|
|
|
|
|
|
$HELP{'list'}=$HELP{'ls'}; |
1166
|
|
|
|
|
|
|
|
1167
|
|
|
|
|
|
|
$HELP{'count'}=[<<'END']; |
1168
|
|
|
|
|
|
|
usage: count |
1169
|
|
|
|
|
|
|
|
1170
|
|
|
|
|
|
|
aliases: print_value get |
1171
|
|
|
|
|
|
|
|
1172
|
|
|
|
|
|
|
description: |
1173
|
|
|
|
|
|
|
Calculate a given expression. If the result is a |
1174
|
|
|
|
|
|
|
node-list, return number of nodes in the node-list. If the |
1175
|
|
|
|
|
|
|
results in a boolean, numeric or literal value, return |
1176
|
|
|
|
|
|
|
the value. |
1177
|
|
|
|
|
|
|
|
1178
|
|
|
|
|
|
|
END |
1179
|
|
|
|
|
|
|
|
1180
|
|
|
|
|
|
|
$HELP{'print_value'}=$HELP{'count'}; |
1181
|
|
|
|
|
|
|
$HELP{'get'}=$HELP{'count'}; |
1182
|
|
|
|
|
|
|
|
1183
|
|
|
|
|
|
|
$HELP{'perl-code'}=[<<'END']; |
1184
|
|
|
|
|
|
|
Perl-code argument type |
1185
|
|
|
|
|
|
|
|
1186
|
|
|
|
|
|
|
description: |
1187
|
|
|
|
|
|
|
A block of perl code enclosed in curly brackets or an |
1188
|
|
|
|
|
|
|
expression which interpolates to a perl expression. Variables |
1189
|
|
|
|
|
|
|
defined in XSH are visible in perl code as well. Since, in the |
1190
|
|
|
|
|
|
|
interactive mode, XSH redirects output to the terminal, you |
1191
|
|
|
|
|
|
|
cannot simply use perl print function for output if you want |
1192
|
|
|
|
|
|
|
to filter the result with a shell command. Instead use the |
1193
|
|
|
|
|
|
|
predefined perl routine `echo(...)' which is equivalent to |
1194
|
|
|
|
|
|
|
Perl's `print $::OUT ...'. The `$::OUT' perl-variable stores |
1195
|
|
|
|
|
|
|
the reference to the terminal file handle. |
1196
|
|
|
|
|
|
|
|
1197
|
|
|
|
|
|
|
For more information about embedded Perl code in XSH, |
1198
|
|
|
|
|
|
|
predefined functions etc. see . |
1199
|
|
|
|
|
|
|
|
1200
|
|
|
|
|
|
|
Example: |
1201
|
|
|
|
|
|
|
xsh> $i="foo"; |
1202
|
|
|
|
|
|
|
xsh> eval { echo "$i-bar\n"; } # prints foo-bar |
1203
|
|
|
|
|
|
|
xsh> eval 'echo "\$i-bar\n";' # exactly the same as above |
1204
|
|
|
|
|
|
|
xsh> eval 'echo "$i-bar\n";' # prints foo-bar too, but $i is |
1205
|
|
|
|
|
|
|
# interpolated by XSH. Perl actually evaluates echo "foo-bar\n"; |
1206
|
|
|
|
|
|
|
|
1207
|
|
|
|
|
|
|
END |
1208
|
|
|
|
|
|
|
|
1209
|
|
|
|
|
|
|
|
1210
|
|
|
|
|
|
|
$HELP{'perl'}=[<<'END']; |
1211
|
|
|
|
|
|
|
usage: eval |
1212
|
|
|
|
|
|
|
|
1213
|
|
|
|
|
|
|
aliases: eval |
1214
|
|
|
|
|
|
|
|
1215
|
|
|
|
|
|
|
description: |
1216
|
|
|
|
|
|
|
Evaluate a given perl expression. |
1217
|
|
|
|
|
|
|
|
1218
|
|
|
|
|
|
|
see also: count |
1219
|
|
|
|
|
|
|
|
1220
|
|
|
|
|
|
|
END |
1221
|
|
|
|
|
|
|
|
1222
|
|
|
|
|
|
|
$HELP{'eval'}=$HELP{'perl'}; |
1223
|
|
|
|
|
|
|
|
1224
|
|
|
|
|
|
|
$HELP{'remove'}=[<<'END']; |
1225
|
|
|
|
|
|
|
usage: remove |
1226
|
|
|
|
|
|
|
|
1227
|
|
|
|
|
|
|
aliases: rm prune delete del |
1228
|
|
|
|
|
|
|
|
1229
|
|
|
|
|
|
|
description: |
1230
|
|
|
|
|
|
|
Remove all nodes matching . |
1231
|
|
|
|
|
|
|
|
1232
|
|
|
|
|
|
|
Example: Get rid of all evil creatures. |
1233
|
|
|
|
|
|
|
|
1234
|
|
|
|
|
|
|
xsh> del //creature[@manner='evil'] |
1235
|
|
|
|
|
|
|
|
1236
|
|
|
|
|
|
|
END |
1237
|
|
|
|
|
|
|
|
1238
|
|
|
|
|
|
|
$HELP{'rm'}=$HELP{'remove'}; |
1239
|
|
|
|
|
|
|
$HELP{'prune'}=$HELP{'remove'}; |
1240
|
|
|
|
|
|
|
$HELP{'delete'}=$HELP{'remove'}; |
1241
|
|
|
|
|
|
|
$HELP{'del'}=$HELP{'remove'}; |
1242
|
|
|
|
|
|
|
|
1243
|
|
|
|
|
|
|
$HELP{'print'}=[<<'END']; |
1244
|
|
|
|
|
|
|
usage: print [ ...] |
1245
|
|
|
|
|
|
|
|
1246
|
|
|
|
|
|
|
aliases: echo |
1247
|
|
|
|
|
|
|
|
1248
|
|
|
|
|
|
|
description: |
1249
|
|
|
|
|
|
|
Interpolate and print a given expression(s). |
1250
|
|
|
|
|
|
|
|
1251
|
|
|
|
|
|
|
END |
1252
|
|
|
|
|
|
|
|
1253
|
|
|
|
|
|
|
$HELP{'echo'}=$HELP{'print'}; |
1254
|
|
|
|
|
|
|
|
1255
|
|
|
|
|
|
|
$HELP{'sort'}=[<<'END']; |
1256
|
|
|
|
|
|
|
usage: sort | % |
1257
|
|
|
|
|
|
|
|
1258
|
|
|
|
|
|
|
description: |
1259
|
|
|
|
|
|
|
EXPERIMENTAL! This command is not yet guaranteed to remain in |
1260
|
|
|
|
|
|
|
the future releases. |
1261
|
|
|
|
|
|
|
|
1262
|
|
|
|
|
|
|
DOCUMENTATION OBSOLETE! Syntax changed! |
1263
|
|
|
|
|
|
|
|
1264
|
|
|
|
|
|
|
This command may be used to sort the node-list stored in the |
1265
|
|
|
|
|
|
|
node-list variable . First, for each node in the node-list |
1266
|
|
|
|
|
|
|
%, the first argument (either a or |
1267
|
|
|
|
|
|
|
expression), which serves as a sorting criterion, is evaluated |
1268
|
|
|
|
|
|
|
in the context of the node and the obtained value is stored |
1269
|
|
|
|
|
|
|
together with the node. (In case of the result of |
1270
|
|
|
|
|
|
|
whatever type is cast to a string). Then perl's sorting |
1271
|
|
|
|
|
|
|
algorithm is used to sort the nodelist, consulting the second, |
1272
|
|
|
|
|
|
|
, argument to compare nodes. Before the |
1273
|
|
|
|
|
|
|
is evaluated, the values obtained from the previous evaluation |
1274
|
|
|
|
|
|
|
of the sorting crierion argument on the two nodes being |
1275
|
|
|
|
|
|
|
compared are stored into `$a' and `$b' variables in the |
1276
|
|
|
|
|
|
|
respective order. The being consulted is supposed |
1277
|
|
|
|
|
|
|
to return either -1 (the first node should come first), 0 (no |
1278
|
|
|
|
|
|
|
order precedence), or 1 (the second node should come first). |
1279
|
|
|
|
|
|
|
Note that Perl provides very convenient operators `cmp' and |
1280
|
|
|
|
|
|
|
`<=>' for string and numeric comparison of this kind as shown |
1281
|
|
|
|
|
|
|
in the examples below. |
1282
|
|
|
|
|
|
|
|
1283
|
|
|
|
|
|
|
Remember that `sort' (unlike , , or ) |
1284
|
|
|
|
|
|
|
evaluates the first argument (the sorting criterion) |
1285
|
|
|
|
|
|
|
in a way to obtain a string. Thus you need not to bother with |
1286
|
|
|
|
|
|
|
wrapping node-queries with a `string()' function but you must |
1287
|
|
|
|
|
|
|
remember to explicitly wrap the expression in `count()' if the |
1288
|
|
|
|
|
|
|
number of the nodes is to be the sorting criterion. |
1289
|
|
|
|
|
|
|
|
1290
|
|
|
|
|
|
|
Example: Sort creatures by name (XPath-based sort) in ascending order |
1291
|
|
|
|
|
|
|
using current locale settings |
1292
|
|
|
|
|
|
|
|
1293
|
|
|
|
|
|
|
xsh> local %c=/middle-earth[1]/creatures |
1294
|
|
|
|
|
|
|
xsh> sort @name { use locale; lc($a) cmp lc($b) } %c |
1295
|
|
|
|
|
|
|
xsh> xmove %c into /middle-earth[1]# replaces the creatures |
1296
|
|
|
|
|
|
|
|
1297
|
|
|
|
|
|
|
Example: Sort (descending order) a node-list by score (Perl-based sort) |
1298
|
|
|
|
|
|
|
|
1299
|
|
|
|
|
|
|
xsh> sort { $scores{ literal('@name') } } { $b <=> $a } %players |
1300
|
|
|
|
|
|
|
|
1301
|
|
|
|
|
|
|
END |
1302
|
|
|
|
|
|
|
|
1303
|
|
|
|
|
|
|
|
1304
|
|
|
|
|
|
|
$HELP{'map'}=[<<'END']; |
1305
|
|
|
|
|
|
|
usage: map |
1306
|
|
|
|
|
|
|
|
1307
|
|
|
|
|
|
|
aliases: sed |
1308
|
|
|
|
|
|
|
|
1309
|
|
|
|
|
|
|
description: |
1310
|
|
|
|
|
|
|
This command provides an easy way to modify node's data |
1311
|
|
|
|
|
|
|
(content) using arbitrary Perl code. |
1312
|
|
|
|
|
|
|
|
1313
|
|
|
|
|
|
|
Each of the nodes matching is passes its data to the |
1314
|
|
|
|
|
|
|
via the `$_' variable and receives the (possibly) |
1315
|
|
|
|
|
|
|
modified data using the same variable. |
1316
|
|
|
|
|
|
|
|
1317
|
|
|
|
|
|
|
Since element nodes do not really have any proper content |
1318
|
|
|
|
|
|
|
(they are only a storage for other nodes), node's name (tag) |
1319
|
|
|
|
|
|
|
is used in case of elements. Note, however, that recent |
1320
|
|
|
|
|
|
|
versions of XSH provide a special command with a very |
1321
|
|
|
|
|
|
|
similar syntax to `map', that should be used for renaming |
1322
|
|
|
|
|
|
|
element, attribute, and processing instruction nodes. |
1323
|
|
|
|
|
|
|
|
1324
|
|
|
|
|
|
|
Example: Capitalises all hobbit names |
1325
|
|
|
|
|
|
|
|
1326
|
|
|
|
|
|
|
xsh> map { $_=ucfirst($_) } //hobbit/@name |
1327
|
|
|
|
|
|
|
|
1328
|
|
|
|
|
|
|
Example: Changes goblins to orcs in all hobbit tales. |
1329
|
|
|
|
|
|
|
|
1330
|
|
|
|
|
|
|
xsh> map { s/goblin/orc/gi } //hobbit/tale/text() |
1331
|
|
|
|
|
|
|
|
1332
|
|
|
|
|
|
|
END |
1333
|
|
|
|
|
|
|
|
1334
|
|
|
|
|
|
|
$HELP{'sed'}=$HELP{'map'}; |
1335
|
|
|
|
|
|
|
|
1336
|
|
|
|
|
|
|
$HELP{'rename'}=[<<'END']; |
1337
|
|
|
|
|
|
|
usage: rename |
1338
|
|
|
|
|
|
|
|
1339
|
|
|
|
|
|
|
description: |
1340
|
|
|
|
|
|
|
This command is very similar to the |
1341
|
|
|
|
|
|
|
it operates on nodes' names rather than their data/values. For |
1342
|
|
|
|
|
|
|
every element, attribute or processing-instruction matched by |
1343
|
|
|
|
|
|
|
the expression the following procedure is used: 1) the |
1344
|
|
|
|
|
|
|
name of the node is stored into Perl's `$_' variable, 2) the |
1345
|
|
|
|
|
|
|
is evaluated, and 3) the (posibly changed) content |
1346
|
|
|
|
|
|
|
of the `$_' variable is used as a new name for the node. |
1347
|
|
|
|
|
|
|
|
1348
|
|
|
|
|
|
|
Example: Renames all hobbits to halflings |
1349
|
|
|
|
|
|
|
|
1350
|
|
|
|
|
|
|
xsh> map $_='halfling' //hobbit |
1351
|
|
|
|
|
|
|
|
1352
|
|
|
|
|
|
|
Example: Make all elements and attributes uppercase |
1353
|
|
|
|
|
|
|
|
1354
|
|
|
|
|
|
|
xsh> map { $_=uc($_) } (//*|//@*) |
1355
|
|
|
|
|
|
|
|
1356
|
|
|
|
|
|
|
see also: map |
1357
|
|
|
|
|
|
|
|
1358
|
|
|
|
|
|
|
END |
1359
|
|
|
|
|
|
|
|
1360
|
|
|
|
|
|
|
|
1361
|
|
|
|
|
|
|
$HELP{'close'}=[<<'END']; |
1362
|
|
|
|
|
|
|
usage: close [] |
1363
|
|
|
|
|
|
|
|
1364
|
|
|
|
|
|
|
description: |
1365
|
|
|
|
|
|
|
Close the document identified by , removing its parse-tree |
1366
|
|
|
|
|
|
|
from memory (note also that all nodes belonging to the |
1367
|
|
|
|
|
|
|
document are removed from all nodelists they appear in). If |
1368
|
|
|
|
|
|
|
is omitted, the command closes the current document. |
1369
|
|
|
|
|
|
|
|
1370
|
|
|
|
|
|
|
END |
1371
|
|
|
|
|
|
|
|
1372
|
|
|
|
|
|
|
|
1373
|
|
|
|
|
|
|
$HELP{'select'}=[<<'END']; |
1374
|
|
|
|
|
|
|
usage: select |
1375
|
|
|
|
|
|
|
|
1376
|
|
|
|
|
|
|
description: |
1377
|
|
|
|
|
|
|
Make the document identifier to be used in the next xpath |
1378
|
|
|
|
|
|
|
evaluation without identifier prefix. |
1379
|
|
|
|
|
|
|
|
1380
|
|
|
|
|
|
|
Example: |
1381
|
|
|
|
|
|
|
xsh> a=mydoc1.xml # opens and selects a |
1382
|
|
|
|
|
|
|
xsh> ls / # lists a |
1383
|
|
|
|
|
|
|
xsh> b=mydoc2.xml # opens and selects b |
1384
|
|
|
|
|
|
|
xsh> ls / # lists b |
1385
|
|
|
|
|
|
|
xsh> ls a:/ # lists and selects a |
1386
|
|
|
|
|
|
|
xsh> select b # does nothing except selecting b |
1387
|
|
|
|
|
|
|
xsh> ls / # lists b |
1388
|
|
|
|
|
|
|
|
1389
|
|
|
|
|
|
|
END |
1390
|
|
|
|
|
|
|
|
1391
|
|
|
|
|
|
|
|
1392
|
|
|
|
|
|
|
$HELP{'open'}=[<<'END']; |
1393
|
|
|
|
|
|
|
usage: [open [HTML|XML|DOCBOOK] [FILE|PIPE|STRING]] = |
1394
|
|
|
|
|
|
|
|
1395
|
|
|
|
|
|
|
description: |
1396
|
|
|
|
|
|
|
Load a new XML, HTML or SGML DOCBOOK document from the file |
1397
|
|
|
|
|
|
|
(actually arbitrary URL), command output or string provided by |
1398
|
|
|
|
|
|
|
the . In XSH the document is given a symbolic name |
1399
|
|
|
|
|
|
|
. To identify the documentin commands like close, save, |
1400
|
|
|
|
|
|
|
validate, dtd or enc simply use . In commands which work |
1401
|
|
|
|
|
|
|
on document nodes, give : prefix to XPath expressions to |
1402
|
|
|
|
|
|
|
point the XPath to the document. |
1403
|
|
|
|
|
|
|
|
1404
|
|
|
|
|
|
|
Example: |
1405
|
|
|
|
|
|
|
xsh> open x=mydoc.xml # open a document |
1406
|
|
|
|
|
|
|
|
1407
|
|
|
|
|
|
|
# open a HTML document from the Internet |
1408
|
|
|
|
|
|
|
xsh> open HTML h="http://www.google.com/?q=xsh" |
1409
|
|
|
|
|
|
|
# quote file name if it contains whitespace |
1410
|
|
|
|
|
|
|
xsh> open y="document with a long name with spaces.xml" |
1411
|
|
|
|
|
|
|
|
1412
|
|
|
|
|
|
|
# you may omit the word open when loading an XML file/URI. |
1413
|
|
|
|
|
|
|
xsh> z=mybook.xml |
1414
|
|
|
|
|
|
|
|
1415
|
|
|
|
|
|
|
# use HTML or DOCBOOK keywords to load these types |
1416
|
|
|
|
|
|
|
xsh> open HTML z=index.htm |
1417
|
|
|
|
|
|
|
|
1418
|
|
|
|
|
|
|
# use PIPE keyword to read output of a command |
1419
|
|
|
|
|
|
|
xsh> open HTML PIPE z='wget -O - xsh.sourceforge.net/index.html' |
1420
|
|
|
|
|
|
|
|
1421
|
|
|
|
|
|
|
# use z: prefix to identify the document opened with the |
1422
|
|
|
|
|
|
|
# previous comand in an XPath expression. |
1423
|
|
|
|
|
|
|
xsh> ls z://chapter/title |
1424
|
|
|
|
|
|
|
|
1425
|
|
|
|
|
|
|
END |
1426
|
|
|
|
|
|
|
|
1427
|
|
|
|
|
|
|
|
1428
|
|
|
|
|
|
|
$HELP{'create'}=[<<'END']; |
1429
|
|
|
|
|
|
|
usage: create |
1430
|
|
|
|
|
|
|
|
1431
|
|
|
|
|
|
|
aliases: new |
1432
|
|
|
|
|
|
|
|
1433
|
|
|
|
|
|
|
description: |
1434
|
|
|
|
|
|
|
Create a new document using to form the root |
1435
|
|
|
|
|
|
|
element and associate it with a given identifier. |
1436
|
|
|
|
|
|
|
|
1437
|
|
|
|
|
|
|
Example: |
1438
|
|
|
|
|
|
|
xsh> create t1 root |
1439
|
|
|
|
|
|
|
xsh> ls / |
1440
|
|
|
|
|
|
|
|
1441
|
|
|
|
|
|
|
|
1442
|
|
|
|
|
|
|
|
1443
|
|
|
|
|
|
|
xsh> create t2 "Just a test" |
1444
|
|
|
|
|
|
|
xsh> ls / |
1445
|
|
|
|
|
|
|
|
1446
|
|
|
|
|
|
|
Just a test |
1447
|
|
|
|
|
|
|
xsh> files |
1448
|
|
|
|
|
|
|
scratch = new_document.xml |
1449
|
|
|
|
|
|
|
t1 = new_document1.xml |
1450
|
|
|
|
|
|
|
t2 = new_document2.xml |
1451
|
|
|
|
|
|
|
|
1452
|
|
|
|
|
|
|
see also: open clone |
1453
|
|
|
|
|
|
|
|
1454
|
|
|
|
|
|
|
END |
1455
|
|
|
|
|
|
|
|
1456
|
|
|
|
|
|
|
$HELP{'new'}=$HELP{'create'}; |
1457
|
|
|
|
|
|
|
|
1458
|
|
|
|
|
|
|
$HELP{'save'}=[<<'END']; |
1459
|
|
|
|
|
|
|
usage: save [HTML|XML|XInclude] [FILE|PIPE|STRING] [encoding ] |
1460
|
|
|
|
|
|
|
or |
1461
|
|
|
|
|
|
|
save |
1462
|
|
|
|
|
|
|
or |
1463
|
|
|
|
|
|
|
save |
1464
|
|
|
|
|
|
|
|
1465
|
|
|
|
|
|
|
description: |
1466
|
|
|
|
|
|
|
Save the document identified by . Using one of the `FILE', |
1467
|
|
|
|
|
|
|
`PIPE', `STRING' keywords the user may choose to save the |
1468
|
|
|
|
|
|
|
document to a file send it to a given command's input via a |
1469
|
|
|
|
|
|
|
pipe or simply return its content as a string. If none of the |
1470
|
|
|
|
|
|
|
keywords is used, it defaults to FILE. If saving to a PIPE, |
1471
|
|
|
|
|
|
|
the argument must provide the coresponding |
1472
|
|
|
|
|
|
|
command and all its parameters. If saving to a FILE, the |
1473
|
|
|
|
|
|
|
argument may provide a filename; if omitted, it |
1474
|
|
|
|
|
|
|
defaults to the original filename of the document. If saving |
1475
|
|
|
|
|
|
|
to a STRING, the argument is ignored and may |
1476
|
|
|
|
|
|
|
freely be omitted. |
1477
|
|
|
|
|
|
|
|
1478
|
|
|
|
|
|
|
The output format is controlled using one of the XML, HTML, |
1479
|
|
|
|
|
|
|
XInclude keywords (see below). If the format keyword is |
1480
|
|
|
|
|
|
|
ommited, save it defaults to XML. |
1481
|
|
|
|
|
|
|
|
1482
|
|
|
|
|
|
|
Note, that a document should be saved as HTML only if it |
1483
|
|
|
|
|
|
|
actually is a HTML document. Note also, that the optional |
1484
|
|
|
|
|
|
|
encoding parameter forces character conversion only; it is up |
1485
|
|
|
|
|
|
|
to the user to declare the document encoding in the |
1486
|
|
|
|
|
|
|
appropriate HTML tag. |
1487
|
|
|
|
|
|
|
|
1488
|
|
|
|
|
|
|
The XInclude keyword automatically implies XML format and can |
1489
|
|
|
|
|
|
|
be used to force XSH to save all already expanded XInclude |
1490
|
|
|
|
|
|
|
sections back to their original files while replacing them |
1491
|
|
|
|
|
|
|
with tags in the main XML file. Moreover, all |
1492
|
|
|
|
|
|
|
material included within elements from the |
1493
|
|
|
|
|
|
|
http://www.w3.org/2001/XInclude namespace is saved to separate |
1494
|
|
|
|
|
|
|
files too according to the `href' attribute, leaving only |
1495
|
|
|
|
|
|
|
empty element in the root file. This feature may be |
1496
|
|
|
|
|
|
|
used to split the document to new XInclude fragments. |
1497
|
|
|
|
|
|
|
|
1498
|
|
|
|
|
|
|
The encoding keyword followed by a can be used to |
1499
|
|
|
|
|
|
|
convert the document from its original encoding to a different |
1500
|
|
|
|
|
|
|
encoding. In case of XML output, the declaration is |
1501
|
|
|
|
|
|
|
changed accordingly. The new encoding is also set as the |
1502
|
|
|
|
|
|
|
document encoding for the particular document. |
1503
|
|
|
|
|
|
|
|
1504
|
|
|
|
|
|
|
Example: Use save to preview a HTML document in Lynx |
1505
|
|
|
|
|
|
|
|
1506
|
|
|
|
|
|
|
save HTML PIPE mydoc 'lynx -stdin' |
1507
|
|
|
|
|
|
|
|
1508
|
|
|
|
|
|
|
see also: open close enc documents |
1509
|
|
|
|
|
|
|
|
1510
|
|
|
|
|
|
|
END |
1511
|
|
|
|
|
|
|
|
1512
|
|
|
|
|
|
|
|
1513
|
|
|
|
|
|
|
$HELP{'dtd'}=[<<'END']; |
1514
|
|
|
|
|
|
|
usage: dtd [] |
1515
|
|
|
|
|
|
|
|
1516
|
|
|
|
|
|
|
description: |
1517
|
|
|
|
|
|
|
Print external or internal DTD for a given document. If no |
1518
|
|
|
|
|
|
|
document identifier is given, the current document is used. |
1519
|
|
|
|
|
|
|
|
1520
|
|
|
|
|
|
|
see also: valid validate |
1521
|
|
|
|
|
|
|
|
1522
|
|
|
|
|
|
|
END |
1523
|
|
|
|
|
|
|
|
1524
|
|
|
|
|
|
|
|
1525
|
|
|
|
|
|
|
$HELP{'set-enc'}=[<<'END']; |
1526
|
|
|
|
|
|
|
usage: set-enc [] |
1527
|
|
|
|
|
|
|
|
1528
|
|
|
|
|
|
|
description: |
1529
|
|
|
|
|
|
|
Changes character encoding of a given document. If no document |
1530
|
|
|
|
|
|
|
is given, the command applies to the current document. |
1531
|
|
|
|
|
|
|
This has two effects: changing the XMLDecl encoding |
1532
|
|
|
|
|
|
|
declaration in the document prolog to display the new encoding |
1533
|
|
|
|
|
|
|
and making all future operations on the document |
1534
|
|
|
|
|
|
|
default to the given charset. |
1535
|
|
|
|
|
|
|
|
1536
|
|
|
|
|
|
|
Example: |
1537
|
|
|
|
|
|
|
xsh> ls |
1538
|
|
|
|
|
|
|
|
1539
|
|
|
|
|
|
|
... |
1540
|
|
|
|
|
|
|
xsh> set-enc "utf-8" |
1541
|
|
|
|
|
|
|
xsh> ls |
1542
|
|
|
|
|
|
|
|
1543
|
|
|
|
|
|
|
... |
1544
|
|
|
|
|
|
|
xsh> save # saves the file in UTF-8 encoding |
1545
|
|
|
|
|
|
|
|
1546
|
|
|
|
|
|
|
see also: enc doc-info |
1547
|
|
|
|
|
|
|
|
1548
|
|
|
|
|
|
|
END |
1549
|
|
|
|
|
|
|
|
1550
|
|
|
|
|
|
|
|
1551
|
|
|
|
|
|
|
$HELP{'set-standalone'}=[<<'END']; |
1552
|
|
|
|
|
|
|
usage: set-standalone [] |
1553
|
|
|
|
|
|
|
|
1554
|
|
|
|
|
|
|
description: |
1555
|
|
|
|
|
|
|
Changes the value of `standalone' declaration in the XMLDecl |
1556
|
|
|
|
|
|
|
prolog of a document. The should evaluate to |
1557
|
|
|
|
|
|
|
either 1 or 0 or `'yes'' or `'no''. The result of applying the |
1558
|
|
|
|
|
|
|
command on other values is not specified. If no document |
1559
|
|
|
|
|
|
|
is given, the command applies to the current document. |
1560
|
|
|
|
|
|
|
|
1561
|
|
|
|
|
|
|
see also: doc-info |
1562
|
|
|
|
|
|
|
|
1563
|
|
|
|
|
|
|
END |
1564
|
|
|
|
|
|
|
|
1565
|
|
|
|
|
|
|
|
1566
|
|
|
|
|
|
|
$HELP{'enc'}=[<<'END']; |
1567
|
|
|
|
|
|
|
usage: enc [] |
1568
|
|
|
|
|
|
|
|
1569
|
|
|
|
|
|
|
description: |
1570
|
|
|
|
|
|
|
Print the original document encoding string. If no document |
1571
|
|
|
|
|
|
|
identifier is given, the current document is used. |
1572
|
|
|
|
|
|
|
|
1573
|
|
|
|
|
|
|
see also: set-enc |
1574
|
|
|
|
|
|
|
|
1575
|
|
|
|
|
|
|
END |
1576
|
|
|
|
|
|
|
|
1577
|
|
|
|
|
|
|
|
1578
|
|
|
|
|
|
|
$HELP{'validate'}=[<<'END']; |
1579
|
|
|
|
|
|
|
usage: validate [] |
1580
|
|
|
|
|
|
|
or |
1581
|
|
|
|
|
|
|
validate DTD PUBLIC [SYSTEM ] |
1582
|
|
|
|
|
|
|
or |
1583
|
|
|
|
|
|
|
validate (DTD|RelaxNG|XSD) FILE [] |
1584
|
|
|
|
|
|
|
or |
1585
|
|
|
|
|
|
|
validate (DTD|RelaxNG|XSD) STRING [] |
1586
|
|
|
|
|
|
|
or |
1587
|
|
|
|
|
|
|
validate (RelaxNG|XSD) DOC [] |
1588
|
|
|
|
|
|
|
|
1589
|
|
|
|
|
|
|
description: |
1590
|
|
|
|
|
|
|
This command validates the document identified with |
1591
|
|
|
|
|
|
|
against a DTD, RelaxNG or XSD schema and report all validity |
1592
|
|
|
|
|
|
|
errors. If no document identifier is given, the current |
1593
|
|
|
|
|
|
|
document is used. A DTD can be specified either by its PUBLIC |
1594
|
|
|
|
|
|
|
or SYSTEM identifier (or both), or as a STRING. RelaxNG and |
1595
|
|
|
|
|
|
|
XSD schemas can be specified either as a filename or url (FILE |
1596
|
|
|
|
|
|
|
), as a string (STRING ), or as a XSH |
1597
|
|
|
|
|
|
|
document (DOC ). If no schema is specified, validation is |
1598
|
|
|
|
|
|
|
performed against the internal or external DTD subset of the |
1599
|
|
|
|
|
|
|
document being validated. |
1600
|
|
|
|
|
|
|
|
1601
|
|
|
|
|
|
|
Example: |
1602
|
|
|
|
|
|
|
open mydoc="test.xml" |
1603
|
|
|
|
|
|
|
# in all examples below, mydoc can be ommited |
1604
|
|
|
|
|
|
|
validate mydoc; # validate against the documet's DOCTYPE |
1605
|
|
|
|
|
|
|
validate DTD PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" mydoc |
1606
|
|
|
|
|
|
|
validate DTD SYSTEM "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" mydoc |
1607
|
|
|
|
|
|
|
validate DTD FILE "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" mydoc |
1608
|
|
|
|
|
|
|
|
1609
|
|
|
|
|
|
|
Example: |
1610
|
|
|
|
|
|
|
validate RelaxNG FILE "test.rng" mydoc |
1611
|
|
|
|
|
|
|
validate RelaxNG STRING $relaxschema mydoc |
1612
|
|
|
|
|
|
|
open rng="test.rng" |
1613
|
|
|
|
|
|
|
validate RelaxNG DOC rng mydoc |
1614
|
|
|
|
|
|
|
|
1615
|
|
|
|
|
|
|
Example: |
1616
|
|
|
|
|
|
|
validate XSD FILE "test.xsd" mydoc |
1617
|
|
|
|
|
|
|
validate XSD STRING $xsdschema mydoc |
1618
|
|
|
|
|
|
|
open xsd="test.xsd" |
1619
|
|
|
|
|
|
|
validate XSD DOC xsd mydoc |
1620
|
|
|
|
|
|
|
|
1621
|
|
|
|
|
|
|
see also: valid dtd |
1622
|
|
|
|
|
|
|
|
1623
|
|
|
|
|
|
|
END |
1624
|
|
|
|
|
|
|
|
1625
|
|
|
|
|
|
|
|
1626
|
|
|
|
|
|
|
$HELP{'valid'}=[<<'END']; |
1627
|
|
|
|
|
|
|
usage: valid [validation-scheme] [] |
1628
|
|
|
|
|
|
|
|
1629
|
|
|
|
|
|
|
description: |
1630
|
|
|
|
|
|
|
Check and report the validity of the document with |
1631
|
|
|
|
|
|
|
respect to a DTD, RelaxNG, or XSD schemas specified in |
1632
|
|
|
|
|
|
|
`validation-scheme' (see for information, on how |
1633
|
|
|
|
|
|
|
`validation-scheme' may be specified). Prints "yes" if the |
1634
|
|
|
|
|
|
|
document is valid and "no" otherwise. If no document |
1635
|
|
|
|
|
|
|
identifier is given, the current document is used. If no |
1636
|
|
|
|
|
|
|
`validation-scheme' is specified, the validity against the DTD |
1637
|
|
|
|
|
|
|
subset is checked. |
1638
|
|
|
|
|
|
|
|
1639
|
|
|
|
|
|
|
see also: validate dtd |
1640
|
|
|
|
|
|
|
|
1641
|
|
|
|
|
|
|
END |
1642
|
|
|
|
|
|
|
|
1643
|
|
|
|
|
|
|
|
1644
|
|
|
|
|
|
|
$HELP{'exit'}=[<<'END']; |
1645
|
|
|
|
|
|
|
usage: exit [] |
1646
|
|
|
|
|
|
|
|
1647
|
|
|
|
|
|
|
aliases: quit |
1648
|
|
|
|
|
|
|
|
1649
|
|
|
|
|
|
|
description: |
1650
|
|
|
|
|
|
|
Exit xsh immediately, optionally with the exit-code resulting |
1651
|
|
|
|
|
|
|
from a given expression. |
1652
|
|
|
|
|
|
|
|
1653
|
|
|
|
|
|
|
WARNING: No files are saved on exit. |
1654
|
|
|
|
|
|
|
|
1655
|
|
|
|
|
|
|
END |
1656
|
|
|
|
|
|
|
|
1657
|
|
|
|
|
|
|
$HELP{'quit'}=$HELP{'exit'}; |
1658
|
|
|
|
|
|
|
|
1659
|
|
|
|
|
|
|
$HELP{'process-xinclude'}=[<<'END']; |
1660
|
|
|
|
|
|
|
usage: process_xinclude [] |
1661
|
|
|
|
|
|
|
|
1662
|
|
|
|
|
|
|
aliases: process_xinclude process-xincludes process_xincludes xinclude xincludes load_xincludes load-xincludes load_xinclude load-xinclude |
1663
|
|
|
|
|
|
|
|
1664
|
|
|
|
|
|
|
description: |
1665
|
|
|
|
|
|
|
Process any xinclude tags in the document . |
1666
|
|
|
|
|
|
|
|
1667
|
|
|
|
|
|
|
see also: parser-expands-xinclude |
1668
|
|
|
|
|
|
|
|
1669
|
|
|
|
|
|
|
END |
1670
|
|
|
|
|
|
|
|
1671
|
|
|
|
|
|
|
$HELP{'process_xinclude'}=$HELP{'process-xinclude'}; |
1672
|
|
|
|
|
|
|
$HELP{'process-xincludes'}=$HELP{'process-xinclude'}; |
1673
|
|
|
|
|
|
|
$HELP{'process_xincludes'}=$HELP{'process-xinclude'}; |
1674
|
|
|
|
|
|
|
$HELP{'xinclude'}=$HELP{'process-xinclude'}; |
1675
|
|
|
|
|
|
|
$HELP{'xincludes'}=$HELP{'process-xinclude'}; |
1676
|
|
|
|
|
|
|
$HELP{'load_xincludes'}=$HELP{'process-xinclude'}; |
1677
|
|
|
|
|
|
|
$HELP{'load-xincludes'}=$HELP{'process-xinclude'}; |
1678
|
|
|
|
|
|
|
$HELP{'load_xinclude'}=$HELP{'process-xinclude'}; |
1679
|
|
|
|
|
|
|
$HELP{'load-xinclude'}=$HELP{'process-xinclude'}; |
1680
|
|
|
|
|
|
|
|
1681
|
|
|
|
|
|
|
$HELP{'cd'}=[<<'END']; |
1682
|
|
|
|
|
|
|
usage: cd [] |
1683
|
|
|
|
|
|
|
|
1684
|
|
|
|
|
|
|
aliases: chxpath |
1685
|
|
|
|
|
|
|
|
1686
|
|
|
|
|
|
|
description: |
1687
|
|
|
|
|
|
|
Change current context node (and current document) to the |
1688
|
|
|
|
|
|
|
first node matching a given argument. |
1689
|
|
|
|
|
|
|
|
1690
|
|
|
|
|
|
|
END |
1691
|
|
|
|
|
|
|
|
1692
|
|
|
|
|
|
|
$HELP{'chxpath'}=$HELP{'cd'}; |
1693
|
|
|
|
|
|
|
|
1694
|
|
|
|
|
|
|
$HELP{'pwd'}=[<<'END']; |
1695
|
|
|
|
|
|
|
usage: pwd |
1696
|
|
|
|
|
|
|
|
1697
|
|
|
|
|
|
|
description: |
1698
|
|
|
|
|
|
|
Print XPath leading to the current context node. This is |
1699
|
|
|
|
|
|
|
equivalent to `locate .'. |
1700
|
|
|
|
|
|
|
|
1701
|
|
|
|
|
|
|
see also: locate |
1702
|
|
|
|
|
|
|
|
1703
|
|
|
|
|
|
|
END |
1704
|
|
|
|
|
|
|
|
1705
|
|
|
|
|
|
|
|
1706
|
|
|
|
|
|
|
$HELP{'locate'}=[<<'END']; |
1707
|
|
|
|
|
|
|
usage: locate |
1708
|
|
|
|
|
|
|
|
1709
|
|
|
|
|
|
|
description: |
1710
|
|
|
|
|
|
|
Print canonical XPaths leading to nodes matched by a given |
1711
|
|
|
|
|
|
|
. |
1712
|
|
|
|
|
|
|
|
1713
|
|
|
|
|
|
|
see also: pwd |
1714
|
|
|
|
|
|
|
|
1715
|
|
|
|
|
|
|
END |
1716
|
|
|
|
|
|
|
|
1717
|
|
|
|
|
|
|
|
1718
|
|
|
|
|
|
|
$HELP{'xupdate'}=[<<'END']; |
1719
|
|
|
|
|
|
|
usage: xupdate [] |
1720
|
|
|
|
|
|
|
|
1721
|
|
|
|
|
|
|
description: |
1722
|
|
|
|
|
|
|
Modify the current document or the document specified by the |
1723
|
|
|
|
|
|
|
second argument according to XUpdate commands of the |
1724
|
|
|
|
|
|
|
first document. XUpdate is a XML Update Language which |
1725
|
|
|
|
|
|
|
aims to be a language for updating XML documents. |
1726
|
|
|
|
|
|
|
|
1727
|
|
|
|
|
|
|
XUpdate langauge is described in XUpdate Working Draft at |
1728
|
|
|
|
|
|
|
http://www.xmldb.org/xupdate/xupdate-wd.html. |
1729
|
|
|
|
|
|
|
|
1730
|
|
|
|
|
|
|
XUpdate output can be generated for example by Python xmldiff |
1731
|
|
|
|
|
|
|
utility from http://www.logilab.org/xmldiff/. Unfortunatelly, |
1732
|
|
|
|
|
|
|
there are few bugs (or, as I tend to say In case of Python, |
1733
|
|
|
|
|
|
|
white-space problems) in their code, so its XUpdate output is |
1734
|
|
|
|
|
|
|
not always correct. |
1735
|
|
|
|
|
|
|
|
1736
|
|
|
|
|
|
|
END |
1737
|
|
|
|
|
|
|
|
1738
|
|
|
|
|
|
|
|
1739
|
|
|
|
|
|
|
$HELP{'verbose'}=[<<'END']; |
1740
|
|
|
|
|
|
|
usage: verbose |
1741
|
|
|
|
|
|
|
|
1742
|
|
|
|
|
|
|
description: |
1743
|
|
|
|
|
|
|
Turn on verbose messages (default). |
1744
|
|
|
|
|
|
|
|
1745
|
|
|
|
|
|
|
This is equivalent to setting `$QUIET' variable to 0. |
1746
|
|
|
|
|
|
|
|
1747
|
|
|
|
|
|
|
see also: quiet |
1748
|
|
|
|
|
|
|
|
1749
|
|
|
|
|
|
|
END |
1750
|
|
|
|
|
|
|
|
1751
|
|
|
|
|
|
|
|
1752
|
|
|
|
|
|
|
$HELP{'test-mode'}=[<<'END']; |
1753
|
|
|
|
|
|
|
usage: test-mode |
1754
|
|
|
|
|
|
|
|
1755
|
|
|
|
|
|
|
aliases: test_mode |
1756
|
|
|
|
|
|
|
|
1757
|
|
|
|
|
|
|
description: |
1758
|
|
|
|
|
|
|
Switch into test mode in which no commands are actually |
1759
|
|
|
|
|
|
|
executed and only command syntax is checked. |
1760
|
|
|
|
|
|
|
|
1761
|
|
|
|
|
|
|
This is equivalent to setting `$TEST_MODE' variable to 1. |
1762
|
|
|
|
|
|
|
|
1763
|
|
|
|
|
|
|
see also: run-mode |
1764
|
|
|
|
|
|
|
|
1765
|
|
|
|
|
|
|
END |
1766
|
|
|
|
|
|
|
|
1767
|
|
|
|
|
|
|
$HELP{'test_mode'}=$HELP{'test-mode'}; |
1768
|
|
|
|
|
|
|
|
1769
|
|
|
|
|
|
|
$HELP{'run-mode'}=[<<'END']; |
1770
|
|
|
|
|
|
|
usage: run-mode |
1771
|
|
|
|
|
|
|
|
1772
|
|
|
|
|
|
|
aliases: run_mode |
1773
|
|
|
|
|
|
|
|
1774
|
|
|
|
|
|
|
description: |
1775
|
|
|
|
|
|
|
Switch into normal XSH mode in which all commands are |
1776
|
|
|
|
|
|
|
executed. |
1777
|
|
|
|
|
|
|
|
1778
|
|
|
|
|
|
|
This is equivalent to setting `$TEST_MODE' variable to 0. |
1779
|
|
|
|
|
|
|
|
1780
|
|
|
|
|
|
|
see also: test-mode |
1781
|
|
|
|
|
|
|
|
1782
|
|
|
|
|
|
|
END |
1783
|
|
|
|
|
|
|
|
1784
|
|
|
|
|
|
|
$HELP{'run_mode'}=$HELP{'run-mode'}; |
1785
|
|
|
|
|
|
|
|
1786
|
|
|
|
|
|
|
$HELP{'debug'}=[<<'END']; |
1787
|
|
|
|
|
|
|
usage: debug |
1788
|
|
|
|
|
|
|
|
1789
|
|
|
|
|
|
|
description: |
1790
|
|
|
|
|
|
|
Turn on debugging messages. |
1791
|
|
|
|
|
|
|
|
1792
|
|
|
|
|
|
|
This is equivalent to setting `$DEBUG' variable to 1. |
1793
|
|
|
|
|
|
|
|
1794
|
|
|
|
|
|
|
see also: nodebug |
1795
|
|
|
|
|
|
|
|
1796
|
|
|
|
|
|
|
END |
1797
|
|
|
|
|
|
|
|
1798
|
|
|
|
|
|
|
|
1799
|
|
|
|
|
|
|
$HELP{'nodebug'}=[<<'END']; |
1800
|
|
|
|
|
|
|
usage: nodebug |
1801
|
|
|
|
|
|
|
|
1802
|
|
|
|
|
|
|
description: |
1803
|
|
|
|
|
|
|
Turn off debugging messages. |
1804
|
|
|
|
|
|
|
|
1805
|
|
|
|
|
|
|
This is equivalent to setting `$DEBUG' variable to 0. |
1806
|
|
|
|
|
|
|
|
1807
|
|
|
|
|
|
|
see also: debug |
1808
|
|
|
|
|
|
|
|
1809
|
|
|
|
|
|
|
END |
1810
|
|
|
|
|
|
|
|
1811
|
|
|
|
|
|
|
|
1812
|
|
|
|
|
|
|
$HELP{'version'}=[<<'END']; |
1813
|
|
|
|
|
|
|
usage: version |
1814
|
|
|
|
|
|
|
|
1815
|
|
|
|
|
|
|
description: |
1816
|
|
|
|
|
|
|
Prints program version plus version numbers of the most |
1817
|
|
|
|
|
|
|
important libraries used. |
1818
|
|
|
|
|
|
|
|
1819
|
|
|
|
|
|
|
END |
1820
|
|
|
|
|
|
|
|
1821
|
|
|
|
|
|
|
|
1822
|
|
|
|
|
|
|
$HELP{'validation'}=[<<'END']; |
1823
|
|
|
|
|
|
|
usage: validation |
1824
|
|
|
|
|
|
|
|
1825
|
|
|
|
|
|
|
description: |
1826
|
|
|
|
|
|
|
Turn on validation during the parse process if the |
1827
|
|
|
|
|
|
|
is non-zero or off otherwise. In XSH version 1.6 |
1828
|
|
|
|
|
|
|
and later, defaults to off. |
1829
|
|
|
|
|
|
|
|
1830
|
|
|
|
|
|
|
This command is equivalent to setting the `$VALIDATION' |
1831
|
|
|
|
|
|
|
variable. |
1832
|
|
|
|
|
|
|
|
1833
|
|
|
|
|
|
|
END |
1834
|
|
|
|
|
|
|
|
1835
|
|
|
|
|
|
|
|
1836
|
|
|
|
|
|
|
$HELP{'recovering'}=[<<'END']; |
1837
|
|
|
|
|
|
|
usage: recovering |
1838
|
|
|
|
|
|
|
|
1839
|
|
|
|
|
|
|
description: |
1840
|
|
|
|
|
|
|
Turn on recovering parser mode if the is non-zero |
1841
|
|
|
|
|
|
|
or off otherwise. Defaults to off. Note, that the in the |
1842
|
|
|
|
|
|
|
recovering mode, validation is not performed by the parser |
1843
|
|
|
|
|
|
|
even if the validation flag is on and that recovering mode |
1844
|
|
|
|
|
|
|
flag only influences parsing of XML documents (not HTML). |
1845
|
|
|
|
|
|
|
|
1846
|
|
|
|
|
|
|
The recover mode helps to efficiently recover documents that |
1847
|
|
|
|
|
|
|
are almost well-formed. This for example includes documents |
1848
|
|
|
|
|
|
|
without a close tag for the document element (or any other |
1849
|
|
|
|
|
|
|
element inside the document). |
1850
|
|
|
|
|
|
|
|
1851
|
|
|
|
|
|
|
This command is equivalent to setting the `$RECOVERING' |
1852
|
|
|
|
|
|
|
variable. |
1853
|
|
|
|
|
|
|
|
1854
|
|
|
|
|
|
|
END |
1855
|
|
|
|
|
|
|
|
1856
|
|
|
|
|
|
|
|
1857
|
|
|
|
|
|
|
$HELP{'parser-expands-entities'}=[<<'END']; |
1858
|
|
|
|
|
|
|
usage: parser_expands_entities |
1859
|
|
|
|
|
|
|
|
1860
|
|
|
|
|
|
|
aliases: parser_expands_entities |
1861
|
|
|
|
|
|
|
|
1862
|
|
|
|
|
|
|
description: |
1863
|
|
|
|
|
|
|
Enable the entity expansion during the parse process if the |
1864
|
|
|
|
|
|
|
is non-zero, disable it otherwise. If entity |
1865
|
|
|
|
|
|
|
expansion is off, any external parsed entities in the document |
1866
|
|
|
|
|
|
|
are left as entities. Defaults to on. |
1867
|
|
|
|
|
|
|
|
1868
|
|
|
|
|
|
|
This command is equivalent to setting the |
1869
|
|
|
|
|
|
|
`$PARSER_EXPANDS_ENTITIES' variable. |
1870
|
|
|
|
|
|
|
|
1871
|
|
|
|
|
|
|
END |
1872
|
|
|
|
|
|
|
|
1873
|
|
|
|
|
|
|
$HELP{'parser_expands_entities'}=$HELP{'parser-expands-entities'}; |
1874
|
|
|
|
|
|
|
|
1875
|
|
|
|
|
|
|
$HELP{'keep-blanks'}=[<<'END']; |
1876
|
|
|
|
|
|
|
usage: keep_blanks |
1877
|
|
|
|
|
|
|
|
1878
|
|
|
|
|
|
|
aliases: keep_blanks |
1879
|
|
|
|
|
|
|
|
1880
|
|
|
|
|
|
|
description: |
1881
|
|
|
|
|
|
|
Allows you to turn off XML::LibXML's default behaviour of |
1882
|
|
|
|
|
|
|
maintaining whitespace in the document. Non-zero expression |
1883
|
|
|
|
|
|
|
forces the XML parser to preserve all whitespace. |
1884
|
|
|
|
|
|
|
|
1885
|
|
|
|
|
|
|
This command is equivalent to setting the `$KEEP_BLANKS' |
1886
|
|
|
|
|
|
|
variable. |
1887
|
|
|
|
|
|
|
|
1888
|
|
|
|
|
|
|
END |
1889
|
|
|
|
|
|
|
|
1890
|
|
|
|
|
|
|
$HELP{'keep_blanks'}=$HELP{'keep-blanks'}; |
1891
|
|
|
|
|
|
|
|
1892
|
|
|
|
|
|
|
$HELP{'pedantic-parser'}=[<<'END']; |
1893
|
|
|
|
|
|
|
usage: pedantic_parser |
1894
|
|
|
|
|
|
|
|
1895
|
|
|
|
|
|
|
aliases: pedantic_parser |
1896
|
|
|
|
|
|
|
|
1897
|
|
|
|
|
|
|
description: |
1898
|
|
|
|
|
|
|
If you wish, you can make XML::LibXML more pedantic by passing |
1899
|
|
|
|
|
|
|
a non-zero to this command. |
1900
|
|
|
|
|
|
|
|
1901
|
|
|
|
|
|
|
This command is equivalent to setting the `$PEDANTIC_PARSER' |
1902
|
|
|
|
|
|
|
variable. |
1903
|
|
|
|
|
|
|
|
1904
|
|
|
|
|
|
|
END |
1905
|
|
|
|
|
|
|
|
1906
|
|
|
|
|
|
|
$HELP{'pedantic_parser'}=$HELP{'pedantic-parser'}; |
1907
|
|
|
|
|
|
|
|
1908
|
|
|
|
|
|
|
$HELP{'parser-completes-attributes'}=[<<'END']; |
1909
|
|
|
|
|
|
|
usage: parser-completes-attributes |
1910
|
|
|
|
|
|
|
|
1911
|
|
|
|
|
|
|
aliases: complete_attributes complete-attributes parser_completes_attributes |
1912
|
|
|
|
|
|
|
|
1913
|
|
|
|
|
|
|
description: |
1914
|
|
|
|
|
|
|
If the expression is non-zero, this command allows XML parser |
1915
|
|
|
|
|
|
|
to complete the elements attributes lists with the ones |
1916
|
|
|
|
|
|
|
defaulted from the DTDs. By default, this option is enabled. |
1917
|
|
|
|
|
|
|
|
1918
|
|
|
|
|
|
|
This command is equivalent to setting the |
1919
|
|
|
|
|
|
|
`$PARSER_COMPLETES_ATTRIBUTES' variable. |
1920
|
|
|
|
|
|
|
|
1921
|
|
|
|
|
|
|
END |
1922
|
|
|
|
|
|
|
|
1923
|
|
|
|
|
|
|
$HELP{'complete_attributes'}=$HELP{'parser-completes-attributes'}; |
1924
|
|
|
|
|
|
|
$HELP{'complete-attributes'}=$HELP{'parser-completes-attributes'}; |
1925
|
|
|
|
|
|
|
$HELP{'parser_completes_attributes'}=$HELP{'parser-completes-attributes'}; |
1926
|
|
|
|
|
|
|
|
1927
|
|
|
|
|
|
|
$HELP{'indent'}=[<<'END']; |
1928
|
|
|
|
|
|
|
usage: indent |
1929
|
|
|
|
|
|
|
|
1930
|
|
|
|
|
|
|
description: |
1931
|
|
|
|
|
|
|
If the value of is 1, format the XML output while |
1932
|
|
|
|
|
|
|
saving a document by adding some nice ignorable whitespace. If |
1933
|
|
|
|
|
|
|
the value is 2 (or higher), XSH will act as in case of 1, plus |
1934
|
|
|
|
|
|
|
it will add a leading and a trailing linebreak to each text |
1935
|
|
|
|
|
|
|
node. |
1936
|
|
|
|
|
|
|
|
1937
|
|
|
|
|
|
|
Note, that since the underlying C library (libxml2) uses a |
1938
|
|
|
|
|
|
|
hardcoded indentation of 2 space characters per indentation |
1939
|
|
|
|
|
|
|
level, the amount of whitespace used for indentation can not |
1940
|
|
|
|
|
|
|
be altered on runtime. |
1941
|
|
|
|
|
|
|
|
1942
|
|
|
|
|
|
|
This command is equivalent to setting the `$INDENT' variable. |
1943
|
|
|
|
|
|
|
|
1944
|
|
|
|
|
|
|
END |
1945
|
|
|
|
|
|
|
|
1946
|
|
|
|
|
|
|
|
1947
|
|
|
|
|
|
|
$HELP{'empty-tags'}=[<<'END']; |
1948
|
|
|
|
|
|
|
usage: empty-tags |
1949
|
|
|
|
|
|
|
|
1950
|
|
|
|
|
|
|
aliases: empty_tags |
1951
|
|
|
|
|
|
|
|
1952
|
|
|
|
|
|
|
description: |
1953
|
|
|
|
|
|
|
If the value of is 1 (non-zero), empty tags are |
1954
|
|
|
|
|
|
|
serialized as a start-tag/end-tag pair (`'). This |
1955
|
|
|
|
|
|
|
option affects both and and possibly other |
1956
|
|
|
|
|
|
|
commands. Otherwise, they are compacted into a short-tag form |
1957
|
|
|
|
|
|
|
(`'). Default value is `0'. |
1958
|
|
|
|
|
|
|
|
1959
|
|
|
|
|
|
|
This command is equivalent to setting the `$EMPTY_TAGS' |
1960
|
|
|
|
|
|
|
variable. |
1961
|
|
|
|
|
|
|
|
1962
|
|
|
|
|
|
|
END |
1963
|
|
|
|
|
|
|
|
1964
|
|
|
|
|
|
|
$HELP{'empty_tags'}=$HELP{'empty-tags'}; |
1965
|
|
|
|
|
|
|
|
1966
|
|
|
|
|
|
|
$HELP{'skip-dtd'}=[<<'END']; |
1967
|
|
|
|
|
|
|
usage: skip-dtd |
1968
|
|
|
|
|
|
|
|
1969
|
|
|
|
|
|
|
aliases: skip_dtd |
1970
|
|
|
|
|
|
|
|
1971
|
|
|
|
|
|
|
description: |
1972
|
|
|
|
|
|
|
If the value of is 1 (non-zero), DTD DOCTYPE |
1973
|
|
|
|
|
|
|
declaration is omitted from any serialization of XML documents |
1974
|
|
|
|
|
|
|
(including and ). Default value is `0'. |
1975
|
|
|
|
|
|
|
|
1976
|
|
|
|
|
|
|
This command is equivalent to setting the `$SKIP_DTD' |
1977
|
|
|
|
|
|
|
variable. |
1978
|
|
|
|
|
|
|
|
1979
|
|
|
|
|
|
|
END |
1980
|
|
|
|
|
|
|
|
1981
|
|
|
|
|
|
|
$HELP{'skip_dtd'}=$HELP{'skip-dtd'}; |
1982
|
|
|
|
|
|
|
|
1983
|
|
|
|
|
|
|
$HELP{'parser-expands-xinclude'}=[<<'END']; |
1984
|
|
|
|
|
|
|
usage: parser_expands_xinclude |
1985
|
|
|
|
|
|
|
|
1986
|
|
|
|
|
|
|
aliases: parser_expands_xinclude |
1987
|
|
|
|
|
|
|
|
1988
|
|
|
|
|
|
|
description: |
1989
|
|
|
|
|
|
|
If the is non-zero, the parser is allowed to |
1990
|
|
|
|
|
|
|
expand XIinclude tags imidiatly while parsing the document. |
1991
|
|
|
|
|
|
|
|
1992
|
|
|
|
|
|
|
This command is equivalent to setting the |
1993
|
|
|
|
|
|
|
`$PARSER_EXPANDS_XINCLUDE' variable. |
1994
|
|
|
|
|
|
|
|
1995
|
|
|
|
|
|
|
see also: process-xinclude |
1996
|
|
|
|
|
|
|
|
1997
|
|
|
|
|
|
|
END |
1998
|
|
|
|
|
|
|
|
1999
|
|
|
|
|
|
|
$HELP{'parser_expands_xinclude'}=$HELP{'parser-expands-xinclude'}; |
2000
|
|
|
|
|
|
|
|
2001
|
|
|
|
|
|
|
$HELP{'load-ext-dtd'}=[<<'END']; |
2002
|
|
|
|
|
|
|
usage: load_ext_dtd |
2003
|
|
|
|
|
|
|
|
2004
|
|
|
|
|
|
|
aliases: load_ext_dtd |
2005
|
|
|
|
|
|
|
|
2006
|
|
|
|
|
|
|
description: |
2007
|
|
|
|
|
|
|
If the expression is non-zero, XML parser loads external DTD |
2008
|
|
|
|
|
|
|
subsets while parsing. By default, this option is enabled. |
2009
|
|
|
|
|
|
|
|
2010
|
|
|
|
|
|
|
This command is equivalent to setting the `$LOAD_EXT_DTD' |
2011
|
|
|
|
|
|
|
variable. |
2012
|
|
|
|
|
|
|
|
2013
|
|
|
|
|
|
|
END |
2014
|
|
|
|
|
|
|
|
2015
|
|
|
|
|
|
|
$HELP{'load_ext_dtd'}=$HELP{'load-ext-dtd'}; |
2016
|
|
|
|
|
|
|
|
2017
|
|
|
|
|
|
|
$HELP{'encoding'}=[<<'END']; |
2018
|
|
|
|
|
|
|
usage: encoding |
2019
|
|
|
|
|
|
|
|
2020
|
|
|
|
|
|
|
description: |
2021
|
|
|
|
|
|
|
Set the default output character encoding. |
2022
|
|
|
|
|
|
|
|
2023
|
|
|
|
|
|
|
This command is equivalent to setting the `$ENCODING' |
2024
|
|
|
|
|
|
|
variable. |
2025
|
|
|
|
|
|
|
|
2026
|
|
|
|
|
|
|
END |
2027
|
|
|
|
|
|
|
|
2028
|
|
|
|
|
|
|
|
2029
|
|
|
|
|
|
|
$HELP{'query-encoding'}=[<<'END']; |
2030
|
|
|
|
|
|
|
usage: query-encoding |
2031
|
|
|
|
|
|
|
|
2032
|
|
|
|
|
|
|
aliases: query_encoding |
2033
|
|
|
|
|
|
|
|
2034
|
|
|
|
|
|
|
description: |
2035
|
|
|
|
|
|
|
Set the default query character encoding. |
2036
|
|
|
|
|
|
|
|
2037
|
|
|
|
|
|
|
This command is equivalent to setting the `$QUERY_ENCODING' |
2038
|
|
|
|
|
|
|
variable. |
2039
|
|
|
|
|
|
|
|
2040
|
|
|
|
|
|
|
END |
2041
|
|
|
|
|
|
|
|
2042
|
|
|
|
|
|
|
$HELP{'query_encoding'}=$HELP{'query-encoding'}; |
2043
|
|
|
|
|
|
|
|
2044
|
|
|
|
|
|
|
$HELP{'quiet'}=[<<'END']; |
2045
|
|
|
|
|
|
|
usage: quiet |
2046
|
|
|
|
|
|
|
|
2047
|
|
|
|
|
|
|
description: |
2048
|
|
|
|
|
|
|
Turn off verbose messages. |
2049
|
|
|
|
|
|
|
|
2050
|
|
|
|
|
|
|
This command is equivalent to setting the `$QUIET' variable. |
2051
|
|
|
|
|
|
|
|
2052
|
|
|
|
|
|
|
see also: verbose |
2053
|
|
|
|
|
|
|
|
2054
|
|
|
|
|
|
|
END |
2055
|
|
|
|
|
|
|
|
2056
|
|
|
|
|
|
|
|
2057
|
|
|
|
|
|
|
$HELP{'switch-to-new-documents'}=[<<'END']; |
2058
|
|
|
|
|
|
|
usage: switch-to-new-documents |
2059
|
|
|
|
|
|
|
|
2060
|
|
|
|
|
|
|
aliases: switch_to_new_documents |
2061
|
|
|
|
|
|
|
|
2062
|
|
|
|
|
|
|
description: |
2063
|
|
|
|
|
|
|
If non-zero, XSH changes current node to the document node of |
2064
|
|
|
|
|
|
|
a newly open/created files every time a new document is opened |
2065
|
|
|
|
|
|
|
or created with or . Default value for this |
2066
|
|
|
|
|
|
|
option is 1. |
2067
|
|
|
|
|
|
|
|
2068
|
|
|
|
|
|
|
This command is equivalent to setting the |
2069
|
|
|
|
|
|
|
`$SWITCH_TO_NEW_DOCUMENTS' variable. |
2070
|
|
|
|
|
|
|
|
2071
|
|
|
|
|
|
|
END |
2072
|
|
|
|
|
|
|
|
2073
|
|
|
|
|
|
|
$HELP{'switch_to_new_documents'}=$HELP{'switch-to-new-documents'}; |
2074
|
|
|
|
|
|
|
|
2075
|
|
|
|
|
|
|
$HELP{'backups'}=[<<'END']; |
2076
|
|
|
|
|
|
|
usage: backups |
2077
|
|
|
|
|
|
|
|
2078
|
|
|
|
|
|
|
description: |
2079
|
|
|
|
|
|
|
Enable creating backup files on save (default). |
2080
|
|
|
|
|
|
|
|
2081
|
|
|
|
|
|
|
This command is equivalent to setting the `$BACKUPS' variable |
2082
|
|
|
|
|
|
|
to 1. |
2083
|
|
|
|
|
|
|
|
2084
|
|
|
|
|
|
|
see also: nobackups |
2085
|
|
|
|
|
|
|
|
2086
|
|
|
|
|
|
|
END |
2087
|
|
|
|
|
|
|
|
2088
|
|
|
|
|
|
|
|
2089
|
|
|
|
|
|
|
$HELP{'nobackups'}=[<<'END']; |
2090
|
|
|
|
|
|
|
usage: nobackups |
2091
|
|
|
|
|
|
|
|
2092
|
|
|
|
|
|
|
description: |
2093
|
|
|
|
|
|
|
Disable creating backup files on save. |
2094
|
|
|
|
|
|
|
|
2095
|
|
|
|
|
|
|
This command is equivalent to setting the `$BACKUPS' variable |
2096
|
|
|
|
|
|
|
to 0. |
2097
|
|
|
|
|
|
|
|
2098
|
|
|
|
|
|
|
see also: nobackups |
2099
|
|
|
|
|
|
|
|
2100
|
|
|
|
|
|
|
END |
2101
|
|
|
|
|
|
|
|
2102
|
|
|
|
|
|
|
|
2103
|
|
|
|
|
|
|
$HELP{'fold'}=[<<'END']; |
2104
|
|
|
|
|
|
|
usage: fold [] |
2105
|
|
|
|
|
|
|
|
2106
|
|
|
|
|
|
|
description: |
2107
|
|
|
|
|
|
|
This feature is still EXPERIMENTAL! Fold command may be used |
2108
|
|
|
|
|
|
|
to mark elements matching the with a `xsh:fold' |
2109
|
|
|
|
|
|
|
attribute from the `http://xsh.sourceforge.net/xsh/' |
2110
|
|
|
|
|
|
|
namespace. When listing the DOM tree using ` |
2111
|
|
|
|
|
|
|
fold', elements marked in this way are folded to the depth |
2112
|
|
|
|
|
|
|
given by the (default depth is 0 = fold |
2113
|
|
|
|
|
|
|
immediately). |
2114
|
|
|
|
|
|
|
|
2115
|
|
|
|
|
|
|
Example: |
2116
|
|
|
|
|
|
|
xsh> fold //chapter 1 |
2117
|
|
|
|
|
|
|
xsh> ls //chapter[1] fold |
2118
|
|
|
|
|
|
|
|
2119
|
|
|
|
|
|
|
... |
2120
|
|
|
|
|
|
|
... |
2121
|
|
|
|
|
|
|
... |
2122
|
|
|
|
|
|
|
|
2123
|
|
|
|
|
|
|
|
2124
|
|
|
|
|
|
|
see also: unfold ls |
2125
|
|
|
|
|
|
|
|
2126
|
|
|
|
|
|
|
END |
2127
|
|
|
|
|
|
|
|
2128
|
|
|
|
|
|
|
|
2129
|
|
|
|
|
|
|
$HELP{'unfold'}=[<<'END']; |
2130
|
|
|
|
|
|
|
usage: unfold |
2131
|
|
|
|
|
|
|
|
2132
|
|
|
|
|
|
|
description: |
2133
|
|
|
|
|
|
|
This feature is still EXPERIMENTAL! Unfold command removes |
2134
|
|
|
|
|
|
|
`xsh:fold' attributes from all elements matching a given |
2135
|
|
|
|
|
|
|
created by previous usage of . Be aware, that |
2136
|
|
|
|
|
|
|
`xmlns:xsh' namespace declaration may still be present in the |
2137
|
|
|
|
|
|
|
document even when all elements are unfolded. |
2138
|
|
|
|
|
|
|
|
2139
|
|
|
|
|
|
|
see also: fold ls |
2140
|
|
|
|
|
|
|
|
2141
|
|
|
|
|
|
|
END |
2142
|
|
|
|
|
|
|
|
2143
|
|
|
|
|
|
|
|
2144
|
|
|
|
|
|
|
$HELP{'redo'}=[<<'END']; |
2145
|
|
|
|
|
|
|
usage: redo [] |
2146
|
|
|
|
|
|
|
|
2147
|
|
|
|
|
|
|
description: |
2148
|
|
|
|
|
|
|
The redo command restarts a loop block without evaluating the |
2149
|
|
|
|
|
|
|
conditional again. The optional argument may |
2150
|
|
|
|
|
|
|
evaluate to a positive integer number that indicates which |
2151
|
|
|
|
|
|
|
level of the nested loops should be restarted. If omitted, it |
2152
|
|
|
|
|
|
|
defaults to 1, i.e. the innermost loop. |
2153
|
|
|
|
|
|
|
|
2154
|
|
|
|
|
|
|
Using this command outside a loop causes an immediate run-time |
2155
|
|
|
|
|
|
|
error. |
2156
|
|
|
|
|
|
|
|
2157
|
|
|
|
|
|
|
Example: Restart a higher level loop from an inner one |
2158
|
|
|
|
|
|
|
|
2159
|
|
|
|
|
|
|
while ($i<100) { |
2160
|
|
|
|
|
|
|
# ... |
2161
|
|
|
|
|
|
|
foreach //para { |
2162
|
|
|
|
|
|
|
# some code |
2163
|
|
|
|
|
|
|
if $param { |
2164
|
|
|
|
|
|
|
redo; # redo foreach loop |
2165
|
|
|
|
|
|
|
} else { |
2166
|
|
|
|
|
|
|
redo 2; # redo while loop |
2167
|
|
|
|
|
|
|
} |
2168
|
|
|
|
|
|
|
} |
2169
|
|
|
|
|
|
|
} |
2170
|
|
|
|
|
|
|
|
2171
|
|
|
|
|
|
|
see also: foreach while iterate next last |
2172
|
|
|
|
|
|
|
|
2173
|
|
|
|
|
|
|
END |
2174
|
|
|
|
|
|
|
|
2175
|
|
|
|
|
|
|
|
2176
|
|
|
|
|
|
|
$HELP{'next'}=[<<'END']; |
2177
|
|
|
|
|
|
|
usage: next [] |
2178
|
|
|
|
|
|
|
|
2179
|
|
|
|
|
|
|
description: |
2180
|
|
|
|
|
|
|
The next command is like the continue statement in C; it |
2181
|
|
|
|
|
|
|
starts the next iteration of an enclosing loop. The optional |
2182
|
|
|
|
|
|
|
argument may evaluate to a positive integer |
2183
|
|
|
|
|
|
|
number that indicates which level of the nested loops should |
2184
|
|
|
|
|
|
|
be restarted. If omitted, it defaults to 1, i.e. the innermost |
2185
|
|
|
|
|
|
|
loop. |
2186
|
|
|
|
|
|
|
|
2187
|
|
|
|
|
|
|
Using this command outside a loop causes an immediate run-time |
2188
|
|
|
|
|
|
|
error. |
2189
|
|
|
|
|
|
|
|
2190
|
|
|
|
|
|
|
see also: foreach while iterate redo last prev |
2191
|
|
|
|
|
|
|
|
2192
|
|
|
|
|
|
|
END |
2193
|
|
|
|
|
|
|
|
2194
|
|
|
|
|
|
|
|
2195
|
|
|
|
|
|
|
$HELP{'prev'}=[<<'END']; |
2196
|
|
|
|
|
|
|
usage: prev [] |
2197
|
|
|
|
|
|
|
|
2198
|
|
|
|
|
|
|
description: |
2199
|
|
|
|
|
|
|
This command is only allowed inside an `iterate' loop. It |
2200
|
|
|
|
|
|
|
returns the iteration one step back, to the previous node on |
2201
|
|
|
|
|
|
|
the iterated axis. The optional argument may be |
2202
|
|
|
|
|
|
|
used to indicate to which level of nested loops the command |
2203
|
|
|
|
|
|
|
applies to. |
2204
|
|
|
|
|
|
|
|
2205
|
|
|
|
|
|
|
see also: iterate redo last next |
2206
|
|
|
|
|
|
|
|
2207
|
|
|
|
|
|
|
END |
2208
|
|
|
|
|
|
|
|
2209
|
|
|
|
|
|
|
|
2210
|
|
|
|
|
|
|
$HELP{'last'}=[<<'END']; |
2211
|
|
|
|
|
|
|
usage: last [] |
2212
|
|
|
|
|
|
|
|
2213
|
|
|
|
|
|
|
description: |
2214
|
|
|
|
|
|
|
The last command is like the break statement in C (as used in |
2215
|
|
|
|
|
|
|
loops); it immediately exits an enclosing loop. The optional |
2216
|
|
|
|
|
|
|
argument may evaluate to a positive integer |
2217
|
|
|
|
|
|
|
number that indicates which level of the nested loops to quit. |
2218
|
|
|
|
|
|
|
If this argument is omitted, it defaults to 1, i.e. the |
2219
|
|
|
|
|
|
|
innermost loop. |
2220
|
|
|
|
|
|
|
|
2221
|
|
|
|
|
|
|
Using this command outside a subroutine causes an immediate |
2222
|
|
|
|
|
|
|
run-time error. |
2223
|
|
|
|
|
|
|
|
2224
|
|
|
|
|
|
|
see also: foreach while iterate next last |
2225
|
|
|
|
|
|
|
|
2226
|
|
|
|
|
|
|
END |
2227
|
|
|
|
|
|
|
|
2228
|
|
|
|
|
|
|
|
2229
|
|
|
|
|
|
|
$HELP{'return'}=[<<'END']; |
2230
|
|
|
|
|
|
|
usage: return |
2231
|
|
|
|
|
|
|
|
2232
|
|
|
|
|
|
|
description: |
2233
|
|
|
|
|
|
|
This command immediatelly stops the execution of a procedure |
2234
|
|
|
|
|
|
|
it occurs in and returns the execution to the place of the |
2235
|
|
|
|
|
|
|
script from which the subroutine was called. |
2236
|
|
|
|
|
|
|
|
2237
|
|
|
|
|
|
|
Using this command outside a subroutine causes an immediate |
2238
|
|
|
|
|
|
|
run-time error. |
2239
|
|
|
|
|
|
|
|
2240
|
|
|
|
|
|
|
see also: def call |
2241
|
|
|
|
|
|
|
|
2242
|
|
|
|
|
|
|
END |
2243
|
|
|
|
|
|
|
|
2244
|
|
|
|
|
|
|
|
2245
|
|
|
|
|
|
|
$HELP{'throw'}=[<<'END']; |
2246
|
|
|
|
|
|
|
usage: throw |
2247
|
|
|
|
|
|
|
|
2248
|
|
|
|
|
|
|
description: |
2249
|
|
|
|
|
|
|
This command throws and exception containing error message |
2250
|
|
|
|
|
|
|
given by the obligatory argument. If the |
2251
|
|
|
|
|
|
|
exception is not handled by some surrounding block, the |
2252
|
|
|
|
|
|
|
execution is stopped immediatelly and the error message is |
2253
|
|
|
|
|
|
|
printed. |
2254
|
|
|
|
|
|
|
|
2255
|
|
|
|
|
|
|
Note: There is a special class of internal exceptions with |
2256
|
|
|
|
|
|
|
error message starting with a word 'UNCATCHABLE'. Such |
2257
|
|
|
|
|
|
|
exceptions are not trapped by constructions and should |
2258
|
|
|
|
|
|
|
be avoided in ordinary XSH scripts. |
2259
|
|
|
|
|
|
|
|
2260
|
|
|
|
|
|
|
see also: try |
2261
|
|
|
|
|
|
|
|
2262
|
|
|
|
|
|
|
END |
2263
|
|
|
|
|
|
|
|
2264
|
|
|
|
|
|
|
|
2265
|
|
|
|
|
|
|
$HELP{'catalog'}=[<<'END']; |
2266
|
|
|
|
|
|
|
usage: catalog |
2267
|
|
|
|
|
|
|
|
2268
|
|
|
|
|
|
|
description: |
2269
|
|
|
|
|
|
|
Will use a given catalog file as a catalog during all parsing |
2270
|
|
|
|
|
|
|
processes. Using a catalog will significantly speed up parsing |
2271
|
|
|
|
|
|
|
processes if many external ressources are loaded into the |
2272
|
|
|
|
|
|
|
parsed documents (such as DTDs or XIncludes) |
2273
|
|
|
|
|
|
|
|
2274
|
|
|
|
|
|
|
END |
2275
|
|
|
|
|
|
|
|
2276
|
|
|
|
|
|
|
|
2277
|
|
|
|
|
|
|
$HELP{'iterate'}=[<<'END']; |
2278
|
|
|
|
|
|
|
usage: iterate |
2279
|
|
|
|
|
|
|
|
2280
|
|
|
|
|
|
|
description: |
2281
|
|
|
|
|
|
|
Iterate works very much like the XPath variant of , |
2282
|
|
|
|
|
|
|
except that `iterate' evaluates the as soon as |
2283
|
|
|
|
|
|
|
a new node matching a given is found. As a limitation, |
2284
|
|
|
|
|
|
|
the expresion used with `iterate' may only consist of |
2285
|
|
|
|
|
|
|
one XPath step, i.e. it cannot contain an XPath step separator |
2286
|
|
|
|
|
|
|
`/'. |
2287
|
|
|
|
|
|
|
|
2288
|
|
|
|
|
|
|
What are the benefits of `iterate' over a loop, |
2289
|
|
|
|
|
|
|
then? Well, under some circumstances it is efficiency, under |
2290
|
|
|
|
|
|
|
other there are none. To clarify this, we have to dive a bit |
2291
|
|
|
|
|
|
|
deeper into the details of XPath implementation. By |
2292
|
|
|
|
|
|
|
definition, the node-list resulting from evaluation of an |
2293
|
|
|
|
|
|
|
XPath has to be ordered in the canonical document order. That |
2294
|
|
|
|
|
|
|
means that an XPath implementation must contain some kind of a |
2295
|
|
|
|
|
|
|
sorting algorithm. This would not itself be much trouble if a |
2296
|
|
|
|
|
|
|
relative document order of two nodes of a DOM tree could be |
2297
|
|
|
|
|
|
|
determined in a constant time. Unfortunately, the libxml2 |
2298
|
|
|
|
|
|
|
library, used behind XSH, does not implement mechanisms that |
2299
|
|
|
|
|
|
|
would allow this complexity restriction (which is, however, |
2300
|
|
|
|
|
|
|
quite natural and reasonable approach if all the consequences |
2301
|
|
|
|
|
|
|
are considered). Thus, when comparing two nodes, libxml2 |
2302
|
|
|
|
|
|
|
traverses the tree to find their nearest common ancestor and |
2303
|
|
|
|
|
|
|
at that point determines the relative order of the two |
2304
|
|
|
|
|
|
|
subtrees by trying to seek one of them in a list of right |
2305
|
|
|
|
|
|
|
siblings of the other. This of course cannot be handled in a |
2306
|
|
|
|
|
|
|
constant time. As a result, the sorting algorithm, reasonably |
2307
|
|
|
|
|
|
|
efficient for a constant time comparison (polynomial of a |
2308
|
|
|
|
|
|
|
degree < 1.5) or small node-lists, becomes rather unusable for |
2309
|
|
|
|
|
|
|
huge node-lists with linear time comparison (still polynomial |
2310
|
|
|
|
|
|
|
but of a degree > 2). |
2311
|
|
|
|
|
|
|
|
2312
|
|
|
|
|
|
|
The `iterate' command provides a way to avoid sorting the |
2313
|
|
|
|
|
|
|
resulting nodelist by limiting allowed XPath expression to one |
2314
|
|
|
|
|
|
|
step (and thus one axis) at a time. On the other hand, since |
2315
|
|
|
|
|
|
|
`iterate' is implemented in Perl, a proxy object glueing the C |
2316
|
|
|
|
|
|
|
and Perl layers has to be created for every node the iterator |
2317
|
|
|
|
|
|
|
passes by. This (plus some extra subroutine calls) makes it |
2318
|
|
|
|
|
|
|
about two to three times slower compared to a similar |
2319
|
|
|
|
|
|
|
tree-traversing algorithm used by libxml2 itself during XPath |
2320
|
|
|
|
|
|
|
evaluation. |
2321
|
|
|
|
|
|
|
|
2322
|
|
|
|
|
|
|
Our experience shows that `iterate' beats in |
2323
|
|
|
|
|
|
|
performance on large node-lists (>=1500 nodes, but your milage |
2324
|
|
|
|
|
|
|
may vary) while wins on smaller node-lists. |
2325
|
|
|
|
|
|
|
|
2326
|
|
|
|
|
|
|
The following two examples give equivallent results. However, |
2327
|
|
|
|
|
|
|
the one using iterate may be faster esp. if the number of |
2328
|
|
|
|
|
|
|
nodes being counted is very large. |
2329
|
|
|
|
|
|
|
|
2330
|
|
|
|
|
|
|
Example: Count inhabitants of the kingdom of Rohan in productive age |
2331
|
|
|
|
|
|
|
|
2332
|
|
|
|
|
|
|
cd rohan/inhabitants; |
2333
|
|
|
|
|
|
|
iterate child::*[@age>=18 and @age<60] { perl $productive++ }; |
2334
|
|
|
|
|
|
|
echo "$productive inhabitants in productive age"; |
2335
|
|
|
|
|
|
|
|
2336
|
|
|
|
|
|
|
Example: Using XPath |
2337
|
|
|
|
|
|
|
|
2338
|
|
|
|
|
|
|
$productive=count(rohan/inhabitants/*[@age>=18 and @age<60]); |
2339
|
|
|
|
|
|
|
echo "$productive inhabitants in productive age"; |
2340
|
|
|
|
|
|
|
|
2341
|
|
|
|
|
|
|
Use e.g. `| time cut' pipe-line redirection to benchmark a XSH |
2342
|
|
|
|
|
|
|
command on a UNIX system. |
2343
|
|
|
|
|
|
|
|
2344
|
|
|
|
|
|
|
see also: foreach next prev last |
2345
|
|
|
|
|
|
|
|
2346
|
|
|
|
|
|
|
END |
2347
|
|
|
|
|
|
|
|
2348
|
|
|
|
|
|
|
|
2349
|
|
|
|
|
|
|
$HELP{'register-namespace'}=[<<'END']; |
2350
|
|
|
|
|
|
|
usage: register-namespace |
2351
|
|
|
|
|
|
|
|
2352
|
|
|
|
|
|
|
aliases: regns |
2353
|
|
|
|
|
|
|
|
2354
|
|
|
|
|
|
|
description: |
2355
|
|
|
|
|
|
|
Registers the first argument as a prefix for the namespace |
2356
|
|
|
|
|
|
|
given in the second argument. The prefix can later be used in |
2357
|
|
|
|
|
|
|
XPath expressions. |
2358
|
|
|
|
|
|
|
|
2359
|
|
|
|
|
|
|
END |
2360
|
|
|
|
|
|
|
|
2361
|
|
|
|
|
|
|
$HELP{'regns'}=$HELP{'register-namespace'}; |
2362
|
|
|
|
|
|
|
|
2363
|
|
|
|
|
|
|
$HELP{'unregister-namespace'}=[<<'END']; |
2364
|
|
|
|
|
|
|
usage: unregister-namespace |
2365
|
|
|
|
|
|
|
|
2366
|
|
|
|
|
|
|
aliases: unregns |
2367
|
|
|
|
|
|
|
|
2368
|
|
|
|
|
|
|
description: |
2369
|
|
|
|
|
|
|
Unregisters given namespace prefix previously registered using |
2370
|
|
|
|
|
|
|
. The prefix can no longer be used in |
2371
|
|
|
|
|
|
|
XPath expressions unless declared within the current scope of |
2372
|
|
|
|
|
|
|
the queried document. |
2373
|
|
|
|
|
|
|
|
2374
|
|
|
|
|
|
|
END |
2375
|
|
|
|
|
|
|
|
2376
|
|
|
|
|
|
|
$HELP{'unregns'}=$HELP{'unregister-namespace'}; |
2377
|
|
|
|
|
|
|
|
2378
|
|
|
|
|
|
|
$HELP{'register-xhtml-namespace'}=[<<'END']; |
2379
|
|
|
|
|
|
|
usage: register-xhtml-namespace |
2380
|
|
|
|
|
|
|
|
2381
|
|
|
|
|
|
|
aliases: regns-xhtml |
2382
|
|
|
|
|
|
|
|
2383
|
|
|
|
|
|
|
description: |
2384
|
|
|
|
|
|
|
Registers a prefix for the XHTML namespace. The prefix can |
2385
|
|
|
|
|
|
|
later be used in XPath expressions. |
2386
|
|
|
|
|
|
|
|
2387
|
|
|
|
|
|
|
END |
2388
|
|
|
|
|
|
|
|
2389
|
|
|
|
|
|
|
$HELP{'regns-xhtml'}=$HELP{'register-xhtml-namespace'}; |
2390
|
|
|
|
|
|
|
|
2391
|
|
|
|
|
|
|
$HELP{'register-xsh-namespace'}=[<<'END']; |
2392
|
|
|
|
|
|
|
usage: register-xsh-namespace |
2393
|
|
|
|
|
|
|
|
2394
|
|
|
|
|
|
|
aliases: regns-xsh |
2395
|
|
|
|
|
|
|
|
2396
|
|
|
|
|
|
|
description: |
2397
|
|
|
|
|
|
|
Registers a new prefix for the XSH namespace. The prefix can |
2398
|
|
|
|
|
|
|
later be used in XPath expressions. Note, that XSH namespace |
2399
|
|
|
|
|
|
|
is by default registered with `xsh' prefix. This command is |
2400
|
|
|
|
|
|
|
thus, in general, useful only when some document uses `xsh' |
2401
|
|
|
|
|
|
|
prefix for a different namespace. |
2402
|
|
|
|
|
|
|
|
2403
|
|
|
|
|
|
|
END |
2404
|
|
|
|
|
|
|
|
2405
|
|
|
|
|
|
|
$HELP{'regns-xsh'}=$HELP{'register-xsh-namespace'}; |
2406
|
|
|
|
|
|
|
|
2407
|
|
|
|
|
|
|
$HELP{'register-function'}=[<<'END']; |
2408
|
|
|
|
|
|
|
usage: register-function |
2409
|
|
|
|
|
|
|
|
2410
|
|
|
|
|
|
|
aliases: regfunc |
2411
|
|
|
|
|
|
|
|
2412
|
|
|
|
|
|
|
description: |
2413
|
|
|
|
|
|
|
EXPERIMENTAL! Register given perl code as a new XPath |
2414
|
|
|
|
|
|
|
extension function under a name provided in the first argument |
2415
|
|
|
|
|
|
|
(). XML::LibXML DOM API may be used in the perl |
2416
|
|
|
|
|
|
|
code for object processing. If the name contains a colon, then |
2417
|
|
|
|
|
|
|
the first part before the colon must be a registered namespace |
2418
|
|
|
|
|
|
|
prefix (see ) and the function is |
2419
|
|
|
|
|
|
|
registered within the corresponding namespace. |
2420
|
|
|
|
|
|
|
|
2421
|
|
|
|
|
|
|
END |
2422
|
|
|
|
|
|
|
|
2423
|
|
|
|
|
|
|
$HELP{'regfunc'}=$HELP{'register-function'}; |
2424
|
|
|
|
|
|
|
|
2425
|
|
|
|
|
|
|
$HELP{'unregister-function'}=[<<'END']; |
2426
|
|
|
|
|
|
|
usage: unregister-function |
2427
|
|
|
|
|
|
|
|
2428
|
|
|
|
|
|
|
aliases: unregfunc |
2429
|
|
|
|
|
|
|
|
2430
|
|
|
|
|
|
|
description: |
2431
|
|
|
|
|
|
|
EXPERIMENTAL! Unregiseter XPath extension function of a given |
2432
|
|
|
|
|
|
|
name previously registered using . |
2433
|
|
|
|
|
|
|
|
2434
|
|
|
|
|
|
|
END |
2435
|
|
|
|
|
|
|
|
2436
|
|
|
|
|
|
|
$HELP{'unregfunc'}=$HELP{'unregister-function'}; |
2437
|
|
|
|
|
|
|
|
2438
|
|
|
|
|
|
|
$HELP{'stream'}=[<<'END']; |
2439
|
|
|
|
|
|
|
usage: stream input [FILE|PIPE|STRING] |
2440
|
|
|
|
|
|
|
output [FILE|PIPE|STRING] |
2441
|
|
|
|
|
|
|
select |
2442
|
|
|
|
|
|
|
[ select ... ] |
2443
|
|
|
|
|
|
|
|
2444
|
|
|
|
|
|
|
description: |
2445
|
|
|
|
|
|
|
EXPERIMENTAL! This command provides a memory efficient (though |
2446
|
|
|
|
|
|
|
slower) way to process selected parts of an XML document with |
2447
|
|
|
|
|
|
|
XSH. A streaming XML parser (SAX parser) is used to parse the |
2448
|
|
|
|
|
|
|
input. The parser has two states which will be refered to as A |
2449
|
|
|
|
|
|
|
and B below. The initial state of the parser is A. |
2450
|
|
|
|
|
|
|
|
2451
|
|
|
|
|
|
|
In the state A, only a limited vertical portion of the DOM |
2452
|
|
|
|
|
|
|
tree is built. All XML data comming from the input stream |
2453
|
|
|
|
|
|
|
other than start-tags are immediatelly copied to the output |
2454
|
|
|
|
|
|
|
stream. If a new start-tag of an element arrives, a new node |
2455
|
|
|
|
|
|
|
is created in the tree. All siblings of the newly created node |
2456
|
|
|
|
|
|
|
are removed. Thus, in the state A, there is exactly one node |
2457
|
|
|
|
|
|
|
on every level of the tree. After a node is added to the tree, |
2458
|
|
|
|
|
|
|
all the expressions following the `select' keyword are |
2459
|
|
|
|
|
|
|
checked. If none matches, the parser remains in state A and |
2460
|
|
|
|
|
|
|
copies the start-tag to the output stream. Otherwise, the |
2461
|
|
|
|
|
|
|
first expression that matches is remembered and the parser |
2462
|
|
|
|
|
|
|
changes its state to B. |
2463
|
|
|
|
|
|
|
|
2464
|
|
|
|
|
|
|
In state B the parser builds a complete DOM subtree of the |
2465
|
|
|
|
|
|
|
element that was last added to the tree before the parser |
2466
|
|
|
|
|
|
|
changed its state from A to B. No data are sent to the output |
2467
|
|
|
|
|
|
|
at this stage. When the subtree is complete (i.e. the |
2468
|
|
|
|
|
|
|
corresponding end-tag for its topmost element is encountered), |
2469
|
|
|
|
|
|
|
the of instructions following the |
2470
|
|
|
|
|
|
|
expression that matched is invoked with the root element of |
2471
|
|
|
|
|
|
|
the subtree as the current context node. The commands in |
2472
|
|
|
|
|
|
|
are allowed to transform the whole element |
2473
|
|
|
|
|
|
|
subtree or even to replace it with a different DOM subtree or |
2474
|
|
|
|
|
|
|
subtrees. They must, however, preserve the element's parent as |
2475
|
|
|
|
|
|
|
well as all its ancestor nodes intact. Failing to do so can |
2476
|
|
|
|
|
|
|
result in an error or unpredictable results. |
2477
|
|
|
|
|
|
|
|
2478
|
|
|
|
|
|
|
After the subtree processing returns, all |
2479
|
|
|
|
|
|
|
subtrees that now appear in the DOM tree in the place of the |
2480
|
|
|
|
|
|
|
original subtree are serialized to the output stream. After |
2481
|
|
|
|
|
|
|
that, they are deleted and the parser returns to state A. |
2482
|
|
|
|
|
|
|
|
2483
|
|
|
|
|
|
|
Note that this type of processing highly limits the amount of |
2484
|
|
|
|
|
|
|
information the XPath expressions can use. First notable fact |
2485
|
|
|
|
|
|
|
is that elements can not be selected by their content. The |
2486
|
|
|
|
|
|
|
only information present in the tree at the time of the XPath |
2487
|
|
|
|
|
|
|
evaluation is the element's name and attributes plus the same |
2488
|
|
|
|
|
|
|
information for all its ancestors. There is nothing known yet |
2489
|
|
|
|
|
|
|
about possible child nodes of the element as well as of the |
2490
|
|
|
|
|
|
|
node's position within its siblings. |
2491
|
|
|
|
|
|
|
|
2492
|
|
|
|
|
|
|
END |
2493
|
|
|
|
|
|
|
|
2494
|
|
|
|
|
|
|
|
2495
|
|
|
|
|
|
|
$HELP{'namespaces'}=[<<'END']; |
2496
|
|
|
|
|
|
|
usage: namespaces [] |
2497
|
|
|
|
|
|
|
|
2498
|
|
|
|
|
|
|
description: |
2499
|
|
|
|
|
|
|
For each node matching given lists all namespaces that |
2500
|
|
|
|
|
|
|
are valid in its scope in the form of `xmlns:prefix="uri"' |
2501
|
|
|
|
|
|
|
declarations. If no is given, lists namespaces in the |
2502
|
|
|
|
|
|
|
scope of the current node. |
2503
|
|
|
|
|
|
|
|
2504
|
|
|
|
|
|
|
END |
2505
|
|
|
|
|
|
|
|
2506
|
|
|
|
|
|
|
|
2507
|
|
|
|
|
|
|
$HELP{'xpath-completion'}=[<<'END']; |
2508
|
|
|
|
|
|
|
usage: xpath_completion |
2509
|
|
|
|
|
|
|
|
2510
|
|
|
|
|
|
|
aliases: xpath_completion |
2511
|
|
|
|
|
|
|
|
2512
|
|
|
|
|
|
|
description: |
2513
|
|
|
|
|
|
|
If the is non-zero, enable the TAB completion for |
2514
|
|
|
|
|
|
|
expansions in the interactive shell mode, disable it |
2515
|
|
|
|
|
|
|
otherwise. Defaults to on. |
2516
|
|
|
|
|
|
|
|
2517
|
|
|
|
|
|
|
This command is equivalent to setting the `$XPATH_COMPLETION' |
2518
|
|
|
|
|
|
|
variable. |
2519
|
|
|
|
|
|
|
|
2520
|
|
|
|
|
|
|
END |
2521
|
|
|
|
|
|
|
|
2522
|
|
|
|
|
|
|
$HELP{'xpath_completion'}=$HELP{'xpath-completion'}; |
2523
|
|
|
|
|
|
|
|
2524
|
|
|
|
|
|
|
$HELP{'xpath-axis-completion'}=[<<'END']; |
2525
|
|
|
|
|
|
|
usage: xpath-axis-completion |
2526
|
|
|
|
|
|
|
|
2527
|
|
|
|
|
|
|
aliases: xpath_axis_completion |
2528
|
|
|
|
|
|
|
|
2529
|
|
|
|
|
|
|
description: |
2530
|
|
|
|
|
|
|
The following values are allowed: `always', `never', |
2531
|
|
|
|
|
|
|
`when-empty'. Note, that all other values (including 1) work |
2532
|
|
|
|
|
|
|
as `never'! |
2533
|
|
|
|
|
|
|
|
2534
|
|
|
|
|
|
|
If the evaluates to `always', TAB completion for |
2535
|
|
|
|
|
|
|
XPath expressions always includes axis names. |
2536
|
|
|
|
|
|
|
|
2537
|
|
|
|
|
|
|
If the evaluates to `when-empty', the TAB |
2538
|
|
|
|
|
|
|
completion list for XPath expressions includes axis names only |
2539
|
|
|
|
|
|
|
if no element name matches the completion. |
2540
|
|
|
|
|
|
|
|
2541
|
|
|
|
|
|
|
If the evaluates to `never', the TAB completion |
2542
|
|
|
|
|
|
|
list for XPath expressions never includes axis names. |
2543
|
|
|
|
|
|
|
|
2544
|
|
|
|
|
|
|
The default value for this optio is `always'. |
2545
|
|
|
|
|
|
|
|
2546
|
|
|
|
|
|
|
This command is equivalent to setting the |
2547
|
|
|
|
|
|
|
`$XPATH_AXIS_COMPLETION' variable. |
2548
|
|
|
|
|
|
|
|
2549
|
|
|
|
|
|
|
END |
2550
|
|
|
|
|
|
|
|
2551
|
|
|
|
|
|
|
$HELP{'xpath_axis_completion'}=$HELP{'xpath-axis-completion'}; |
2552
|
|
|
|
|
|
|
|
2553
|
|
|
|
|
|
|
$HELP{'doc-info'}=[<<'END']; |
2554
|
|
|
|
|
|
|
usage: doc-info [] |
2555
|
|
|
|
|
|
|
|
2556
|
|
|
|
|
|
|
aliases: doc_info |
2557
|
|
|
|
|
|
|
|
2558
|
|
|
|
|
|
|
description: |
2559
|
|
|
|
|
|
|
In the present implementation, this command displays |
2560
|
|
|
|
|
|
|
information provided in the `' declaration of a |
2561
|
|
|
|
|
|
|
document: `version', `encoding', `standalone', plus |
2562
|
|
|
|
|
|
|
information about level of `gzip' compression of the original |
2563
|
|
|
|
|
|
|
XML file. |
2564
|
|
|
|
|
|
|
|
2565
|
|
|
|
|
|
|
see also: set-enc set-standalone |
2566
|
|
|
|
|
|
|
|
2567
|
|
|
|
|
|
|
END |
2568
|
|
|
|
|
|
|
|
2569
|
|
|
|
|
|
|
$HELP{'doc_info'}=$HELP{'doc-info'}; |
2570
|
|
|
|
|
|
|
|
2571
|
|
|
|
|
|
|
$HELP{'Documents'}=[<<'END']; |
2572
|
|
|
|
|
|
|
Files/Documents |
2573
|
|
|
|
|
|
|
--------------- |
2574
|
|
|
|
|
|
|
|
2575
|
|
|
|
|
|
|
XSH is intended to query and manipulate XML and HTML documents. Use one |
2576
|
|
|
|
|
|
|
of the `open/open-*/create' commands to load an XML or HTML document from |
2577
|
|
|
|
|
|
|
a local file, external URL (such as http:// or ftp://), string or pipe. |
2578
|
|
|
|
|
|
|
While loading, XSH parses and optionally validates (see and |
2579
|
|
|
|
|
|
|
) the document. Parsed documents are stored in memory as |
2580
|
|
|
|
|
|
|
DOM trees, that can be navigated and manipulated |
2581
|
|
|
|
|
|
|
quite similarly to a local filesystem. |
2582
|
|
|
|
|
|
|
|
2583
|
|
|
|
|
|
|
Every opened document is associated with an identifier (), that is a |
2584
|
|
|
|
|
|
|
symbolic name for the document in XSH and can be used for example as a |
2585
|
|
|
|
|
|
|
prefix of . |
2586
|
|
|
|
|
|
|
|
2587
|
|
|
|
|
|
|
In the current version, XSH is only able to save documents locally. To |
2588
|
|
|
|
|
|
|
store a document on any other location, use command and pipe |
2589
|
|
|
|
|
|
|
redirection to feed the XML representation of the document to any |
2590
|
|
|
|
|
|
|
external program that is able to store it on a remote location. |
2591
|
|
|
|
|
|
|
|
2592
|
|
|
|
|
|
|
Example: Store XSH document DOC on a remote machine using Secure Shell |
2593
|
|
|
|
|
|
|
|
2594
|
|
|
|
|
|
|
xsh> ls DOC:/ | ssh my.remote.org 'cat > test.xml' |
2595
|
|
|
|
|
|
|
|
2596
|
|
|
|
|
|
|
|
2597
|
|
|
|
|
|
|
Related commands: |
2598
|
|
|
|
|
|
|
backups, catalog, clone, close, create, documents, nobackups, open, |
2599
|
|
|
|
|
|
|
process-xinclude, save, select, stream, switch-to-new-documents |
2600
|
|
|
|
|
|
|
|
2601
|
|
|
|
|
|
|
END |
2602
|
|
|
|
|
|
|
|
2603
|
|
|
|
|
|
|
$HELP{'Navigation'}=[<<'END']; |
2604
|
|
|
|
|
|
|
Tree navigation |
2605
|
|
|
|
|
|
|
--------------- |
2606
|
|
|
|
|
|
|
|
2607
|
|
|
|
|
|
|
With XSH, it is possible to browse document trees as if |
2608
|
|
|
|
|
|
|
they were a local filesystem, except that XPath expressions are |
2609
|
|
|
|
|
|
|
used instead of ordinary UNIX paths. |
2610
|
|
|
|
|
|
|
|
2611
|
|
|
|
|
|
|
Current position in the document tree is called the current node. Current |
2612
|
|
|
|
|
|
|
node's XPath may be queried with command. In the interactive shell, |
2613
|
|
|
|
|
|
|
current node is also displayed in the command line prompt. Remember, that |
2614
|
|
|
|
|
|
|
beside command, current node (and document) is silently changed by |
2615
|
|
|
|
|
|
|
all variant of command, command and temporarily also by |
2616
|
|
|
|
|
|
|
the node-list variant of the statement. |
2617
|
|
|
|
|
|
|
|
2618
|
|
|
|
|
|
|
Documents are specified in a similar way as harddrives on DOS/Windows(TM) |
2619
|
|
|
|
|
|
|
systems (except that their names are not limitted to one letter in XSH), |
2620
|
|
|
|
|
|
|
i.e. by a prefix of the form doc: where doc is the associated with |
2621
|
|
|
|
|
|
|
the document. |
2622
|
|
|
|
|
|
|
|
2623
|
|
|
|
|
|
|
To mimic the filesystem navigation as closely as possible, XSH contains |
2624
|
|
|
|
|
|
|
several commands named by analogy of UNIX filesystem commands, such as |
2625
|
|
|
|
|
|
|
, and . |
2626
|
|
|
|
|
|
|
|
2627
|
|
|
|
|
|
|
Example: |
2628
|
|
|
|
|
|
|
xsh scratch:/> open docA="testA.xml" |
2629
|
|
|
|
|
|
|
xsh docB:/> open docB="testB.xml" |
2630
|
|
|
|
|
|
|
xsh> pwd |
2631
|
|
|
|
|
|
|
docB:/ |
2632
|
|
|
|
|
|
|
xsh docB:/> cd docA:/article/chapter[title='Conclusion'] |
2633
|
|
|
|
|
|
|
xsh docA:/article/chapter[5]> pwd |
2634
|
|
|
|
|
|
|
docA:/article/chapter[5] |
2635
|
|
|
|
|
|
|
xsh docA:/article/chapter[5]> cd previous-sibling::chapter |
2636
|
|
|
|
|
|
|
xsh docA:/article/chapter[4]> cd .. |
2637
|
|
|
|
|
|
|
xsh docA:/article> select docB |
2638
|
|
|
|
|
|
|
xsh docB:/> |
2639
|
|
|
|
|
|
|
|
2640
|
|
|
|
|
|
|
|
2641
|
|
|
|
|
|
|
Related commands: |
2642
|
|
|
|
|
|
|
cd, fold, locate, ls, pwd, register-function, register-namespace, |
2643
|
|
|
|
|
|
|
register-xhtml-namespace, register-xsh-namespace, select, unfold, |
2644
|
|
|
|
|
|
|
unregister-function, unregister-namespace |
2645
|
|
|
|
|
|
|
|
2646
|
|
|
|
|
|
|
END |
2647
|
|
|
|
|
|
|
|
2648
|
|
|
|
|
|
|
$HELP{'Manipulation'}=[<<'END']; |
2649
|
|
|
|
|
|
|
Tree modification |
2650
|
|
|
|
|
|
|
----------------- |
2651
|
|
|
|
|
|
|
|
2652
|
|
|
|
|
|
|
XSH provides mechanisms not only to browse and inspect the DOM tree but |
2653
|
|
|
|
|
|
|
also to modify its content by providing commands for copying, moving, and |
2654
|
|
|
|
|
|
|
deleting its nodes as well as adding completely new nodes or XML |
2655
|
|
|
|
|
|
|
fragments to it. It is quite easy to learn these commands since their |
2656
|
|
|
|
|
|
|
names or aliases mimic their well-known filesystem analogies. On the |
2657
|
|
|
|
|
|
|
other hand, many of these commands have two versions one of which is |
2658
|
|
|
|
|
|
|
prefixed with a letter "x". This "x" stands for "cross", thus e.g. |
2659
|
|
|
|
|
|
|
should be read as "cross copy". Let's explain the difference on |
2660
|
|
|
|
|
|
|
the example of . |
2661
|
|
|
|
|
|
|
|
2662
|
|
|
|
|
|
|
When you copy, you have to specify what are you copying and where are you |
2663
|
|
|
|
|
|
|
copying to, so you have to specify the source and the target. XSH is very |
2664
|
|
|
|
|
|
|
much XPath-based so, XPath is used here to specify both of them. However, |
2665
|
|
|
|
|
|
|
there might be more than one node that satisfies an XPath expression. So, |
2666
|
|
|
|
|
|
|
the rule of thumb is that the "cross" variant of a command places one and |
2667
|
|
|
|
|
|
|
every of the source nodes to the location of one and every destination |
2668
|
|
|
|
|
|
|
node, while the plain variant works one-by-one, placing the first source |
2669
|
|
|
|
|
|
|
node to the first destination, the second source node to the second |
2670
|
|
|
|
|
|
|
destination, and so on (as long as there are both source nodes and |
2671
|
|
|
|
|
|
|
destinations left). |
2672
|
|
|
|
|
|
|
|
2673
|
|
|
|
|
|
|
Example: |
2674
|
|
|
|
|
|
|
xsh> create a ""; |
2675
|
|
|
|
|
|
|
xsh> create b ""; |
2676
|
|
|
|
|
|
|
xsh> xcopy a://A replace b://B; |
2677
|
|
|
|
|
|
|
xsh> copy b://C before a://A; |
2678
|
|
|
|
|
|
|
xsh> ls a:/; |
2679
|
|
|
|
|
|
|
|
2680
|
|
|
|
|
|
|
|
2681
|
|
|
|
|
|
|
|
2682
|
|
|
|
|
|
|
xsh> ls b:/; |
2683
|
|
|
|
|
|
|
|
2684
|
|
|
|
|
|
|
|
2685
|
|
|
|
|
|
|
|
2686
|
|
|
|
|
|
|
As already indicated by the example, another issue of tree modification |
2687
|
|
|
|
|
|
|
is the way in which the destination node determines the target location. |
2688
|
|
|
|
|
|
|
Should the source node be placed before, after, or into the resulting |
2689
|
|
|
|
|
|
|
node? Should it replace it completely? This information has to be given |
2690
|
|
|
|
|
|
|
in the argument that usually precedes the destination XPath. |
2691
|
|
|
|
|
|
|
|
2692
|
|
|
|
|
|
|
Now, what happens if source and destination nodes are of incompatible |
2693
|
|
|
|
|
|
|
types? XSH tries to avoid this by implicitly converting between node |
2694
|
|
|
|
|
|
|
types when necessary. For example, if a text, comment, and attribute node |
2695
|
|
|
|
|
|
|
is copied into, before or after an attribute node, the original value of |
2696
|
|
|
|
|
|
|
the attribute is replaced, prepended or appended respectively with the |
2697
|
|
|
|
|
|
|
textual content of the source node. Note however, that element nodes are |
2698
|
|
|
|
|
|
|
never converted into text, attribute or any other textual node. There are |
2699
|
|
|
|
|
|
|
many combinations here, so try yourself and see the results. |
2700
|
|
|
|
|
|
|
|
2701
|
|
|
|
|
|
|
You may even use some more sofisticated way to convert between node |
2702
|
|
|
|
|
|
|
types, as shown in the following example, where an element is first |
2703
|
|
|
|
|
|
|
commented out and than again uncommented. Note, that the particular |
2704
|
|
|
|
|
|
|
approach used for resurrecting the commented XML material works only for |
2705
|
|
|
|
|
|
|
well-balanced chunks of XML. |
2706
|
|
|
|
|
|
|
|
2707
|
|
|
|
|
|
|
Example: Using string variables to convert between different types of nodes |
2708
|
|
|
|
|
|
|
|
2709
|
|
|
|
|
|
|
create doc <
|
2710
|
|
|
|
|
|
|
|
2711
|
|
|
|
|
|
|
|
2712
|
|
|
|
|
|
|
|
2713
|
|
|
|
|
|
|
Intro |
2714
|
|
|
|
|
|
|
|
2715
|
|
|
|
|
|
|
|
2716
|
|
|
|
|
|
|
Rest |
2717
|
|
|
|
|
|
|
|
2718
|
|
|
|
|
|
|
|
2719
|
|
|
|
|
|
|
EOF |
2720
|
|
|
|
|
|
|
|
2721
|
|
|
|
|
|
|
# comment out the first chapter |
2722
|
|
|
|
|
|
|
ls //chapter[1] |> $chapter_xml; |
2723
|
|
|
|
|
|
|
add comment $chapter_xml replace //chapter[1]; |
2724
|
|
|
|
|
|
|
ls / 0; |
2725
|
|
|
|
|
|
|
# OUTPUT: |
2726
|
|
|
|
|
|
|
|
2727
|
|
|
|
|
|
|
|
2728
|
|
|
|
|
|
|
|
2732
|
|
|
|
|
|
|
|
2733
|
|
|
|
|
|
|
Rest |
2734
|
|
|
|
|
|
|
|
2735
|
|
|
|
|
|
|
|
2736
|
|
|
|
|
|
|
|
2737
|
|
|
|
|
|
|
|
2738
|
|
|
|
|
|
|
# un-comment the chapter |
2739
|
|
|
|
|
|
|
$comment = string(//comment()[1]); |
2740
|
|
|
|
|
|
|
add chunk $comment replace //comment()[1]; |
2741
|
|
|
|
|
|
|
ls / 0; |
2742
|
|
|
|
|
|
|
# OUTPUT: |
2743
|
|
|
|
|
|
|
|
2744
|
|
|
|
|
|
|
|
2745
|
|
|
|
|
|
|
|
2746
|
|
|
|
|
|
|
Intro |
2747
|
|
|
|
|
|
|
|
2748
|
|
|
|
|
|
|
|
2749
|
|
|
|
|
|
|
|
2750
|
|
|
|
|
|
|
Rest |
2751
|
|
|
|
|
|
|
|
2752
|
|
|
|
|
|
|
|
2753
|
|
|
|
|
|
|
|
2754
|
|
|
|
|
|
|
|
2755
|
|
|
|
|
|
|
Related commands: |
2756
|
|
|
|
|
|
|
clone, copy, insert, map, move, normalize, process-xinclude, remove, |
2757
|
|
|
|
|
|
|
rename, set-enc, set-standalone, strip-whitespace, xcopy, xinsert, xmove, |
2758
|
|
|
|
|
|
|
xslt, xupdate |
2759
|
|
|
|
|
|
|
|
2760
|
|
|
|
|
|
|
END |
2761
|
|
|
|
|
|
|
|
2762
|
|
|
|
|
|
|
$HELP{'Flow'}=[<<'END']; |
2763
|
|
|
|
|
|
|
Flow control |
2764
|
|
|
|
|
|
|
------------ |
2765
|
|
|
|
|
|
|
|
2766
|
|
|
|
|
|
|
What a scripting language XSH would be had it not some kind of |
2767
|
|
|
|
|
|
|
conditional statements, loops and other stuff that influences the way in |
2768
|
|
|
|
|
|
|
which XSH commands are processed. |
2769
|
|
|
|
|
|
|
|
2770
|
|
|
|
|
|
|
Most notable XSH's feature in this area is that some of the basic flow |
2771
|
|
|
|
|
|
|
control statements, namely , , and have two |
2772
|
|
|
|
|
|
|
variants, an XPath-based one and a Perl-based one. The XPath-based |
2773
|
|
|
|
|
|
|
variant uses expressions to specify the condition or node-lists |
2774
|
|
|
|
|
|
|
to iterate, while the other one utilizes for this purpose. |
2775
|
|
|
|
|
|
|
See descriptions of the individual statements for more detail. |
2776
|
|
|
|
|
|
|
|
2777
|
|
|
|
|
|
|
|
2778
|
|
|
|
|
|
|
Related commands: |
2779
|
|
|
|
|
|
|
call, def, exit, foreach, if, ifinclude, include, iterate, last, next, |
2780
|
|
|
|
|
|
|
prev, redo, return, run-mode, stream, test-mode, throw, try, undef, |
2781
|
|
|
|
|
|
|
unless, while |
2782
|
|
|
|
|
|
|
|
2783
|
|
|
|
|
|
|
END |
2784
|
|
|
|
|
|
|
|
2785
|
|
|
|
|
|
|
$HELP{'Information'}=[<<'END']; |
2786
|
|
|
|
|
|
|
Retrieving more information |
2787
|
|
|
|
|
|
|
--------------------------- |
2788
|
|
|
|
|
|
|
|
2789
|
|
|
|
|
|
|
Beside the possibility to browse the DOM tree and list some parts of it |
2790
|
|
|
|
|
|
|
(as described in ), XSH provides commands to obtain other |
2791
|
|
|
|
|
|
|
information related to open documents as well as the XSH interpreter |
2792
|
|
|
|
|
|
|
itself. These commands are listed bellow. |
2793
|
|
|
|
|
|
|
|
2794
|
|
|
|
|
|
|
|
2795
|
|
|
|
|
|
|
Related commands: |
2796
|
|
|
|
|
|
|
count, defs, doc-info, documents, dtd, enc, help, locate, ls, namespaces, |
2797
|
|
|
|
|
|
|
options, print, pwd, valid, validate, variables, version |
2798
|
|
|
|
|
|
|
|
2799
|
|
|
|
|
|
|
END |
2800
|
|
|
|
|
|
|
|
2801
|
|
|
|
|
|
|
$HELP{'Argtypes'}=[<<'END']; |
2802
|
|
|
|
|
|
|
Argument Types |
2803
|
|
|
|
|
|
|
-------------- |
2804
|
|
|
|
|
|
|
|
2805
|
|
|
|
|
|
|
XSH commands accept different types of arguments, such as usual strings |
2806
|
|
|
|
|
|
|
() or XPath expressions. Notably, these |
2807
|
|
|
|
|
|
|
two types and types based on them support string variable interpolation. |
2808
|
|
|
|
|
|
|
See documentation of the individual types for more information. |
2809
|
|
|
|
|
|
|
|
2810
|
|
|
|
|
|
|
END |
2811
|
|
|
|
|
|
|
|
2812
|
|
|
|
|
|
|
$HELP{'Variables'}=[<<'END']; |
2813
|
|
|
|
|
|
|
Variables |
2814
|
|
|
|
|
|
|
--------- |
2815
|
|
|
|
|
|
|
|
2816
|
|
|
|
|
|
|
In the current version, XSH supports two types of variables: string |
2817
|
|
|
|
|
|
|
(scalar) variables and node-list variables. Perl programmers that might |
2818
|
|
|
|
|
|
|
miss some other kinds of variables (arrays or hashes) may use the support |
2819
|
|
|
|
|
|
|
for interacting with Perl to access these types |
2820
|
|
|
|
|
|
|
(see some examples below). |
2821
|
|
|
|
|
|
|
|
2822
|
|
|
|
|
|
|
These two kinds of variables differ syntactically in the prefix: string |
2823
|
|
|
|
|
|
|
variables are prefixed with a dollar sign (`$') while node-list variables |
2824
|
|
|
|
|
|
|
are prefixed with a percent sign (`%'). |
2825
|
|
|
|
|
|
|
|
2826
|
|
|
|
|
|
|
String Variables |
2827
|
|
|
|
|
|
|
---------------- |
2828
|
|
|
|
|
|
|
|
2829
|
|
|
|
|
|
|
Every string variable name consists of a dollar sign (`$') prefix and |
2830
|
|
|
|
|
|
|
an , that has to be unique among other scalar variables, e.g. |
2831
|
|
|
|
|
|
|
`$variable'. Values are assigned to variables either by simple |
2832
|
|
|
|
|
|
|
assignments of the form `$variable = ' or by |
2833
|
|
|
|
|
|
|
capturing the output of some command with a variable redirection of the |
2834
|
|
|
|
|
|
|
form `command |> $variable'. |
2835
|
|
|
|
|
|
|
|
2836
|
|
|
|
|
|
|
String variables may be used in string expressions, |
2837
|
|
|
|
|
|
|
XPath expressions, or even in perl-code as $ or |
2838
|
|
|
|
|
|
|
${}. In the first two cases, variables act as macros in the sense |
2839
|
|
|
|
|
|
|
that all variables occurences are replaced by the corresponding values |
2840
|
|
|
|
|
|
|
before the expression itself is evaluated. |
2841
|
|
|
|
|
|
|
|
2842
|
|
|
|
|
|
|
To display current value of a variable, use the command, |
2843
|
|
|
|
|
|
|
command or simply the variable name: |
2844
|
|
|
|
|
|
|
|
2845
|
|
|
|
|
|
|
Example: |
2846
|
|
|
|
|
|
|
xsh> $b="chapter"; |
2847
|
|
|
|
|
|
|
xsh> $file="${b}s.xml"; |
2848
|
|
|
|
|
|
|
xsh> open f=$file; |
2849
|
|
|
|
|
|
|
xsh> ls //$b[count(descendant::para)>10] |
2850
|
|
|
|
|
|
|
xsh> print $b |
2851
|
|
|
|
|
|
|
chapter |
2852
|
|
|
|
|
|
|
xsh> $b |
2853
|
|
|
|
|
|
|
$b='chapter'; |
2854
|
|
|
|
|
|
|
xsh> variables |
2855
|
|
|
|
|
|
|
$a='chapters.xml'; |
2856
|
|
|
|
|
|
|
$b='chapter'; |
2857
|
|
|
|
|
|
|
|
2858
|
|
|
|
|
|
|
Node-list Variables |
2859
|
|
|
|
|
|
|
------------------- |
2860
|
|
|
|
|
|
|
|
2861
|
|
|
|
|
|
|
Every string variable name consists of a percent sign (`%') prefix and |
2862
|
|
|
|
|
|
|
an , that has to be unique among other node-list variables, e.g. |
2863
|
|
|
|
|
|
|
`%variable'. |
2864
|
|
|
|
|
|
|
|
2865
|
|
|
|
|
|
|
Node-list variables can be used to store lists of nodes that result |
2866
|
|
|
|
|
|
|
from evaluating an XPath. This is especially useful when several |
2867
|
|
|
|
|
|
|
changes are performed on some set of nodes and evaluating the XPath |
2868
|
|
|
|
|
|
|
expression repeatedly would take too long. Other important use is to |
2869
|
|
|
|
|
|
|
remember a node that would otherwise be extremely hard or even |
2870
|
|
|
|
|
|
|
impossible to locate by XPath expressions after some changes to the |
2871
|
|
|
|
|
|
|
tree structure are made, since such an XPath cannot be predicted in |
2872
|
|
|
|
|
|
|
advance. |
2873
|
|
|
|
|
|
|
|
2874
|
|
|
|
|
|
|
Although node-list variables act just like XPath expressions that would |
2875
|
|
|
|
|
|
|
result in the same node-list, for implementation reasons it is not |
2876
|
|
|
|
|
|
|
possible to use node-list variables as parts of complex XPath |
2877
|
|
|
|
|
|
|
expressions except for one case. They may be only used at the very |
2878
|
|
|
|
|
|
|
beginning of an XPath expression. So while constructions such as |
2879
|
|
|
|
|
|
|
`%creatures[4]', `%creatures[@race='elf']', or |
2880
|
|
|
|
|
|
|
`%creatures/parents/father' do work as expected, |
2881
|
|
|
|
|
|
|
`string(%creatures[2]/@name)' `//creature[%creatures[2]/@name=@name]', |
2882
|
|
|
|
|
|
|
or `%creatures[@race='elf'][2]' do not. In the first two cases it is |
2883
|
|
|
|
|
|
|
because node-list variables cannot be evaluated in the middle of an |
2884
|
|
|
|
|
|
|
XPath expression. The third case fails because this construction |
2885
|
|
|
|
|
|
|
actually translates into a sequence of evaluations of |
2886
|
|
|
|
|
|
|
`self::*[@race='elf'][2]' for each node in the `%creatures' node-list, |
2887
|
|
|
|
|
|
|
which is not equivallent to the intended expression as the `[2]' filter |
2888
|
|
|
|
|
|
|
does not apply to the whole result of `%creatures[@race='elf']' at once |
2889
|
|
|
|
|
|
|
but rather to the partial results. |
2890
|
|
|
|
|
|
|
|
2891
|
|
|
|
|
|
|
Fortunatelly, it is usually possible to work around these unsupported |
2892
|
|
|
|
|
|
|
constructions quite easily. This is typically done by introducing some |
2893
|
|
|
|
|
|
|
more variables as well as using the statement. The following |
2894
|
|
|
|
|
|
|
example should provide some idea on how to do this: |
2895
|
|
|
|
|
|
|
|
2896
|
|
|
|
|
|
|
Example: |
2897
|
|
|
|
|
|
|
# work around for $name=string(%creatures[2]/@name) |
2898
|
|
|
|
|
|
|
xsh> foreach %creatures[2] $name=string(@name) |
2899
|
|
|
|
|
|
|
# work around for ls //creature[%creatures[2]/@name=@name] |
2900
|
|
|
|
|
|
|
xsh> ls //creature[$name=@name] |
2901
|
|
|
|
|
|
|
# work around for ls %creatures[@race='elf'][2] |
2902
|
|
|
|
|
|
|
xsh> %elves = %creatures[@race='elf'] |
2903
|
|
|
|
|
|
|
xsh> ls %elves[2] |
2904
|
|
|
|
|
|
|
|
2905
|
|
|
|
|
|
|
Remember, that when a node is deleted from a tree it is at the same |
2906
|
|
|
|
|
|
|
time removed from all node-lists it occurs in. Note also, that unlike |
2907
|
|
|
|
|
|
|
string variables, node-list variables can not be (and are not intended |
2908
|
|
|
|
|
|
|
to be) directly accessed from Perl code. |
2909
|
|
|
|
|
|
|
|
2910
|
|
|
|
|
|
|
Accessing Perl Variables |
2911
|
|
|
|
|
|
|
------------------------ |
2912
|
|
|
|
|
|
|
|
2913
|
|
|
|
|
|
|
All XSH string variables are usual Perl scalar variables from the |
2914
|
|
|
|
|
|
|
`XML::XSH::Map' namespace, which is the default namespace for any Perl |
2915
|
|
|
|
|
|
|
code evaluated from XSH. Thus it is possible to arbitrarily intermix |
2916
|
|
|
|
|
|
|
XSH and Perl assignments: |
2917
|
|
|
|
|
|
|
|
2918
|
|
|
|
|
|
|
Example: |
2919
|
|
|
|
|
|
|
xsh> ls //chapter[1]/title |
2920
|
|
|
|
|
|
|
Introduction |
2921
|
|
|
|
|
|
|
xsh> $a=string(//chapter[1]/title) |
2922
|
|
|
|
|
|
|
xsh> eval { $b="CHAPTER 1: ".uc($a); } |
2923
|
|
|
|
|
|
|
xsh> print $b |
2924
|
|
|
|
|
|
|
CHAPTER 1: INTRODUCTION |
2925
|
|
|
|
|
|
|
|
2926
|
|
|
|
|
|
|
If needed, it is, however, possible to use any other type of Perl |
2927
|
|
|
|
|
|
|
variables by means of evaluating a corresponding perl code. The |
2928
|
|
|
|
|
|
|
following example demonstrates using Perl hashes to collect and print |
2929
|
|
|
|
|
|
|
some simple racial statistics about the population of Middle-Earth: |
2930
|
|
|
|
|
|
|
|
2931
|
|
|
|
|
|
|
Example: |
2932
|
|
|
|
|
|
|
foreach a:/middle-earth/creature { |
2933
|
|
|
|
|
|
|
$race=string(@race); |
2934
|
|
|
|
|
|
|
eval { $races{$race}++ }; |
2935
|
|
|
|
|
|
|
} |
2936
|
|
|
|
|
|
|
print "Middle-Earth Population (race/number of creatures)" |
2937
|
|
|
|
|
|
|
eval { |
2938
|
|
|
|
|
|
|
echo map "$_/$races{$_}\n", |
2939
|
|
|
|
|
|
|
sort ($a cmp $b), keys(%races); |
2940
|
|
|
|
|
|
|
}; |
2941
|
|
|
|
|
|
|
|
2942
|
|
|
|
|
|
|
|
2943
|
|
|
|
|
|
|
Related commands: |
2944
|
|
|
|
|
|
|
assign, local |
2945
|
|
|
|
|
|
|
|
2946
|
|
|
|
|
|
|
END |
2947
|
|
|
|
|
|
|
|
2948
|
|
|
|
|
|
|
$HELP{'Configuration'}=[<<'END']; |
2949
|
|
|
|
|
|
|
Options |
2950
|
|
|
|
|
|
|
------- |
2951
|
|
|
|
|
|
|
|
2952
|
|
|
|
|
|
|
The following commands are used to modify the default behaviour of the |
2953
|
|
|
|
|
|
|
XML parser or XSH itself. Some of the commands are switch between two |
2954
|
|
|
|
|
|
|
different modes according to a given expression (which is expected to |
2955
|
|
|
|
|
|
|
result either in zero or non-zero value). Other commands also working as |
2956
|
|
|
|
|
|
|
a flip-flop have their own explicit counterpart (e.g. and |
2957
|
|
|
|
|
|
|
or and ). This misconsistency is due to |
2958
|
|
|
|
|
|
|
historical reasons. |
2959
|
|
|
|
|
|
|
|
2960
|
|
|
|
|
|
|
The and options allow to specify character |
2961
|
|
|
|
|
|
|
encoding that should be expected from user as well as the encoding to be |
2962
|
|
|
|
|
|
|
used by XSH on output. This is particularly useful when you work with |
2963
|
|
|
|
|
|
|
UTF-8 encoded documents on a console which supports only 8-bit |
2964
|
|
|
|
|
|
|
characters. |
2965
|
|
|
|
|
|
|
|
2966
|
|
|
|
|
|
|
The command displays current settings by means of XSH commands. |
2967
|
|
|
|
|
|
|
Thus it can not only be used to review current values, but also to store |
2968
|
|
|
|
|
|
|
them future use, e.g. in ~/.xshrc file. |
2969
|
|
|
|
|
|
|
|
2970
|
|
|
|
|
|
|
Example: |
2971
|
|
|
|
|
|
|
xsh> options | cat > ~/.xshrc |
2972
|
|
|
|
|
|
|
|
2973
|
|
|
|
|
|
|
|
2974
|
|
|
|
|
|
|
Related commands: |
2975
|
|
|
|
|
|
|
backups, debug, empty-tags, encoding, indent, keep-blanks, load-ext-dtd, |
2976
|
|
|
|
|
|
|
nobackups, nodebug, options, parser-completes-attributes, |
2977
|
|
|
|
|
|
|
parser-expands-entities, parser-expands-xinclude, pedantic-parser, |
2978
|
|
|
|
|
|
|
query-encoding, quiet, recovering, register-function, register-namespace, |
2979
|
|
|
|
|
|
|
register-xhtml-namespace, register-xsh-namespace, run-mode, skip-dtd, |
2980
|
|
|
|
|
|
|
switch-to-new-documents, test-mode, unregister-function, |
2981
|
|
|
|
|
|
|
unregister-namespace, validation, verbose, xpath-axis-completion, |
2982
|
|
|
|
|
|
|
xpath-completion |
2983
|
|
|
|
|
|
|
|
2984
|
|
|
|
|
|
|
END |
2985
|
|
|
|
|
|
|
|
2986
|
|
|
|
|
|
|
$HELP{'Perl_shell'}=[<<'END']; |
2987
|
|
|
|
|
|
|
Interacting with Perl and Shell |
2988
|
|
|
|
|
|
|
------------------------------- |
2989
|
|
|
|
|
|
|
|
2990
|
|
|
|
|
|
|
To allow more complex tasks to be achieved, XSH provides ways for |
2991
|
|
|
|
|
|
|
interaction with the Perl programming language and the system shell. |
2992
|
|
|
|
|
|
|
|
2993
|
|
|
|
|
|
|
Calling Perl |
2994
|
|
|
|
|
|
|
------------ |
2995
|
|
|
|
|
|
|
|
2996
|
|
|
|
|
|
|
Perl is a language optimized for scanning arbitrary text files, |
2997
|
|
|
|
|
|
|
extracting information from those text files, and printing reports |
2998
|
|
|
|
|
|
|
based on that information. It's also a good language for many system |
2999
|
|
|
|
|
|
|
management tasks. The language is intended to be practical (easy to |
3000
|
|
|
|
|
|
|
use, efficient, and complete). XSH itself is written in Perl, so it is |
3001
|
|
|
|
|
|
|
extremely easy to support this language as an extension to XSH. |
3002
|
|
|
|
|
|
|
|
3003
|
|
|
|
|
|
|
Perl expressions or blocks of code can |
3004
|
|
|
|
|
|
|
either be simply evaluated with the command, used to do quick |
3005
|
|
|
|
|
|
|
changes to nodes of the DOM tree (see |
3006
|
|
|
|
|
|
|
list of strings to iterate over in a loop, or to specify more |
3007
|
|
|
|
|
|
|
complex conditions for , , and statements. |
3008
|
|
|
|
|
|
|
|
3009
|
|
|
|
|
|
|
To prevent conflict between XSH internals and the evaluated perl code, |
3010
|
|
|
|
|
|
|
XSH runs such code in the context of a special namespace |
3011
|
|
|
|
|
|
|
`XML::XSH::Map'. As described in the section , XSH string |
3012
|
|
|
|
|
|
|
variables may be accessed and possibly assigned from Perl code in the |
3013
|
|
|
|
|
|
|
most obvious way, since they actually are Perl variables defined in the |
3014
|
|
|
|
|
|
|
`XML::XSH::Map' namespace. |
3015
|
|
|
|
|
|
|
|
3016
|
|
|
|
|
|
|
The interaction between XSH and Perl actually works also the other way |
3017
|
|
|
|
|
|
|
round, so that you may call back XSH from the evaluated Perl code. For |
3018
|
|
|
|
|
|
|
this, Perl function `xsh' is defined in the `XML::XSH::Map' namespace. |
3019
|
|
|
|
|
|
|
All parameters passed to this function are interpreted as XSH commands. |
3020
|
|
|
|
|
|
|
To simplify evaluation of XPath expressions, another three functions: |
3021
|
|
|
|
|
|
|
The first one, named `count', returns the same value as would be |
3022
|
|
|
|
|
|
|
printed by command in XSH on the same XPath expression. The |
3023
|
|
|
|
|
|
|
second function, named `literal', returns the result of XPath |
3024
|
|
|
|
|
|
|
evaluation as if the whole expression was wrapped with the XPath |
3025
|
|
|
|
|
|
|
`string()' function. In other words, `literal('doc:expression')' |
3026
|
|
|
|
|
|
|
returns the same value as `count('doc:string(expression)')'. The third |
3027
|
|
|
|
|
|
|
function, named `xml_list', returns the result of the XPath search as a |
3028
|
|
|
|
|
|
|
XML string which is equivallent to the output of a on the same |
3029
|
|
|
|
|
|
|
XPath expression (without indentation and without folding or any other |
3030
|
|
|
|
|
|
|
limitation on the depth of the listing). |
3031
|
|
|
|
|
|
|
|
3032
|
|
|
|
|
|
|
In the following examples we use Perl to populate the Middle-Earth with |
3033
|
|
|
|
|
|
|
Hobbits whose names are read from a text file called `hobbits.txt', |
3034
|
|
|
|
|
|
|
unless there are some Hobbits in Middle-Earth already. |
3035
|
|
|
|
|
|
|
|
3036
|
|
|
|
|
|
|
Example: Use Perl to read text files |
3037
|
|
|
|
|
|
|
|
3038
|
|
|
|
|
|
|
unless (//creature[@race='hobbit']) { |
3039
|
|
|
|
|
|
|
perl 'open $file, "hobbits.txt"'; |
3040
|
|
|
|
|
|
|
perl '@hobbits=<$file>'; |
3041
|
|
|
|
|
|
|
perl 'close $file'; |
3042
|
|
|
|
|
|
|
foreach { @hobbits } { |
3043
|
|
|
|
|
|
|
insert element "" |
3044
|
|
|
|
|
|
|
into m:/middle-earth/creatures; |
3045
|
|
|
|
|
|
|
} |
3046
|
|
|
|
|
|
|
} |
3047
|
|
|
|
|
|
|
|
3048
|
|
|
|
|
|
|
Example: The same code as a single Perl block |
3049
|
|
|
|
|
|
|
|
3050
|
|
|
|
|
|
|
perl { |
3051
|
|
|
|
|
|
|
unless (count(//creature[@race='hobbit'])) { |
3052
|
|
|
|
|
|
|
open my $file, "hobbits.txt"; |
3053
|
|
|
|
|
|
|
foreach (<$file>) { |
3054
|
|
|
|
|
|
|
xsh(qq{insert element "" |
3055
|
|
|
|
|
|
|
into m:/middle-earth/creatures}); |
3056
|
|
|
|
|
|
|
} |
3057
|
|
|
|
|
|
|
close $file; |
3058
|
|
|
|
|
|
|
} |
3059
|
|
|
|
|
|
|
}; |
3060
|
|
|
|
|
|
|
|
3061
|
|
|
|
|
|
|
Writing your own XPath extension functions in Perl |
3062
|
|
|
|
|
|
|
-------------------------------------------------- |
3063
|
|
|
|
|
|
|
|
3064
|
|
|
|
|
|
|
XSH allows the user to extend the set of XPath functions by providing |
3065
|
|
|
|
|
|
|
an extension function written in Perl. This can be achieved using the |
3066
|
|
|
|
|
|
|
command. The perl code implementing an extension |
3067
|
|
|
|
|
|
|
function works as a usual perl routine accepting its arguments in `@_' |
3068
|
|
|
|
|
|
|
and returning the result. The following conventions are used: |
3069
|
|
|
|
|
|
|
|
3070
|
|
|
|
|
|
|
The arguments passed to the perl implementation by the XPath engine are |
3071
|
|
|
|
|
|
|
either simple scalars or `XML::LibXML::NodeList' objects, depending on |
3072
|
|
|
|
|
|
|
the types of the XPath arguments. The implementation is responsible for |
3073
|
|
|
|
|
|
|
checking the argument number and types. The implementation may use |
3074
|
|
|
|
|
|
|
arbitrary `XML::LibXML' methods to process the arguments and return the |
3075
|
|
|
|
|
|
|
result. (`XML::LibXML' perl module documentation can be found for |
3076
|
|
|
|
|
|
|
example at |
3077
|
|
|
|
|
|
|
http://search.cpan.org/author/PHISH/XML-LibXML-1.54/LibXML.pm). |
3078
|
|
|
|
|
|
|
|
3079
|
|
|
|
|
|
|
The implementation SHOULD NOT, however, MODIFY the document. Doing so |
3080
|
|
|
|
|
|
|
could not only confuse the XPath engine but result in an critical error |
3081
|
|
|
|
|
|
|
(such as segmentation fault). |
3082
|
|
|
|
|
|
|
|
3083
|
|
|
|
|
|
|
Calling XSH commands from extension function implementations is not |
3084
|
|
|
|
|
|
|
currently allowed. |
3085
|
|
|
|
|
|
|
|
3086
|
|
|
|
|
|
|
The perl code must return a single value, which can be of one of the |
3087
|
|
|
|
|
|
|
following types: a simple scalar (a number or string), |
3088
|
|
|
|
|
|
|
`XML::LibXML::Boolean' object reference (result is a boolean value), |
3089
|
|
|
|
|
|
|
`XML::LibXML::Literal' object reference (result is a string), |
3090
|
|
|
|
|
|
|
`XML::LibXML::Number' object reference (resulat is a float), |
3091
|
|
|
|
|
|
|
`XML::LibXML::Node' (or derived) object reference (result is a nodeset |
3092
|
|
|
|
|
|
|
consisting of a single node), or `XML::LibXML::NodeList' (result is a |
3093
|
|
|
|
|
|
|
nodeset). For convenience, simple (non-blessed) array references |
3094
|
|
|
|
|
|
|
consisting of `XML::LibXML::Node' objects can also be used for a |
3095
|
|
|
|
|
|
|
nodeset result instead of a `XML::LibXML::NodeList'. |
3096
|
|
|
|
|
|
|
|
3097
|
|
|
|
|
|
|
Calling the System Shell |
3098
|
|
|
|
|
|
|
------------------------ |
3099
|
|
|
|
|
|
|
|
3100
|
|
|
|
|
|
|
In the interactive mode, XSH interprets all lines starting with a |
3101
|
|
|
|
|
|
|
exclamation mark (`!') as shell commands and invokes the system shell |
3102
|
|
|
|
|
|
|
to interpret them (this is to mimic FTP command-line interpreters). |
3103
|
|
|
|
|
|
|
|
3104
|
|
|
|
|
|
|
Example: |
3105
|
|
|
|
|
|
|
xsh> !ls -l |
3106
|
|
|
|
|
|
|
-rw-rw-r-- 1 pajas pajas 6355 Mar 14 17:08 Artistic |
3107
|
|
|
|
|
|
|
drwxrwxr-x 2 pajas users 128 Sep 1 10:09 CVS |
3108
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 14859 Aug 26 15:19 ChangeLog |
3109
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 2220 Mar 14 17:03 INSTALL |
3110
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 18009 Jul 15 17:35 LICENSE |
3111
|
|
|
|
|
|
|
-rw-rw-r-- 1 pajas pajas 417 May 9 15:16 MANIFEST |
3112
|
|
|
|
|
|
|
-rw-rw-r-- 1 pajas pajas 126 May 9 15:16 MANIFEST.SKIP |
3113
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 20424 Sep 1 11:04 Makefile |
3114
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 914 Aug 26 14:32 Makefile.PL |
3115
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 1910 Mar 14 17:17 README |
3116
|
|
|
|
|
|
|
-rw-r--r-- 1 pajas pajas 438 Aug 27 13:51 TODO |
3117
|
|
|
|
|
|
|
drwxrwxr-x 5 pajas users 120 Jun 15 10:35 blib |
3118
|
|
|
|
|
|
|
drwxrwxr-x 3 pajas users 1160 Sep 1 10:09 examples |
3119
|
|
|
|
|
|
|
drwxrwxr-x 4 pajas users 96 Jun 15 10:35 lib |
3120
|
|
|
|
|
|
|
-rw-rw-r-- 1 pajas pajas 0 Sep 1 16:23 pm_to_blib |
3121
|
|
|
|
|
|
|
drwxrwxr-x 4 pajas users 584 Sep 1 21:18 src |
3122
|
|
|
|
|
|
|
drwxrwxr-x 3 pajas users 136 Sep 1 10:09 t |
3123
|
|
|
|
|
|
|
-rw-rw-r-- 1 pajas pajas 50 Jun 16 00:06 test |
3124
|
|
|
|
|
|
|
drwxrwxr-x 3 pajas users 496 Sep 1 20:18 tools |
3125
|
|
|
|
|
|
|
-rwxr-xr-x 1 pajas pajas 5104 Aug 30 17:08 xsh |
3126
|
|
|
|
|
|
|
|
3127
|
|
|
|
|
|
|
To invoke a system shell command or program from the non-interactive |
3128
|
|
|
|
|
|
|
mode or from a complex XSH construction, use the command. |
3129
|
|
|
|
|
|
|
|
3130
|
|
|
|
|
|
|
Since UNIX shell commands are very powerful tool for processing textual |
3131
|
|
|
|
|
|
|
data, XSH supports direct redirection of XSH commands output to system |
3132
|
|
|
|
|
|
|
shell command. This is very similarly to the redirection known from |
3133
|
|
|
|
|
|
|
UNIX shells, except that here, of course, the first command in the |
3134
|
|
|
|
|
|
|
pipe-line colone is an XSH command. Since semicolon (`;') is used in |
3135
|
|
|
|
|
|
|
XSH to separate commands, it has to be prefixed with a backslash if it |
3136
|
|
|
|
|
|
|
should be used for other purposes. |
3137
|
|
|
|
|
|
|
|
3138
|
|
|
|
|
|
|
Example: Use grep and less to display context of `funny' |
3139
|
|
|
|
|
|
|
|
3140
|
|
|
|
|
|
|
xsh> ls //chapter[5]/para | grep funny | less |
3141
|
|
|
|
|
|
|
|
3142
|
|
|
|
|
|
|
Example: The same on Windows 2000/XP systems |
3143
|
|
|
|
|
|
|
|
3144
|
|
|
|
|
|
|
xsh> ls //chapter[5]/para | find "funny" | more |
3145
|
|
|
|
|
|
|
|
3146
|
|
|
|
|
|
|
|
3147
|
|
|
|
|
|
|
Related commands: |
3148
|
|
|
|
|
|
|
exec, lcd, map, perl, rename |
3149
|
|
|
|
|
|
|
|
3150
|
|
|
|
|
|
|
END |
3151
|
|
|
|
|
|
|
|
3152
|
|
|
|
|
|
|
$HELP{'commands'}=$HELP{'command'}; |
3153
|
|
|
|
|
|
|
|
3154
|
|
|
|
|
|
|
1; |
3155
|
|
|
|
|
|
|
__END__ |