summaryrefslogtreecommitdiff
path: root/doc/xmlstarlet.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/xmlstarlet.txt')
-rw-r--r--doc/xmlstarlet.txt1325
1 files changed, 1325 insertions, 0 deletions
diff --git a/doc/xmlstarlet.txt b/doc/xmlstarlet.txt
new file mode 100644
index 0000000..309030d
--- /dev/null
+++ b/doc/xmlstarlet.txt
@@ -0,0 +1,1325 @@
+
+
+ XMLSTARLET USER'S GUIDE
+
+ see also http://xmlstar.sourceforge.net/
+
+
+
+
+1. BASIC COMMAND LINE OPTIONS
+====================================================
+
+xml --help
+XMLStarlet Toolkit: Command line utilities for XML
+Usage: xml [<options>] <command> [<cmd-options>]
+where <command> is one of:
+ ed (or edit) - Edit/Update XML document(s)
+ sel (or select) - Select data or query XML document(s) (XPATH, etc)
+ tr (or transform) - Transform XML document(s) using XSLT
+ val (or validate) - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG)
+ fo (or format) - Format XML document(s)
+ el (or elements) - Display element structure of XML document
+ c14n (or canonic) - XML canonicalization
+ ls (or list) - List directory as XML
+ esc (or escape) - Escape special XML characters
+ unesc (or unescape) - Unescape special XML characters
+ pyx (or xmln) - Convert XML into PYX format (based on ESIS - ISO 8879)
+ p2x (or depyx) - Convert PYX into XML
+<options> are:
+ --version - show version
+ --help - show help
+Wherever file name mentioned in command help it is assumed
+that URL can be used instead as well.
+
+Type: xml <command> --help <ENTER> for command help
+
+
+
+
+2. Select/Query XML documents
+====================================================
+
+xml sel --help
+XMLStarlet Toolkit: Select from XML document(s)
+Usage: xml sel <global-options> {<template>} [ <xml-file> ... ]
+where
+ <global-options> - global options for selecting
+ <xml-file> - input XML document file name/uri (stdin is used if missing)
+ <template> - template for querying XML document with following syntax:
+
+<global-options> are:
+ -Q or --quiet - do not write anything to standard output.
+ -C or --comp - display generated XSLT
+ -R or --root - print root element <xsl-select>
+ -T or --text - output is text (default is XML)
+ -I or --indent - indent output
+ -D or --xml-decl - do not omit xml declaration line
+ -B or --noblanks - remove insignificant spaces from XML tree
+ -E or --encode <encoding> - output in the given encoding (utf-8, unicode...)
+ -N <name>=<value> - predefine namespaces (name without 'xmlns:')
+ ex: xsql=urn:oracle-xsql
+ Multiple -N options are allowed.
+ --net - allow fetch DTDs or entities over network
+ --help - display help
+
+Syntax for templates: -t|--template <options>
+where <options>
+ -c or --copy-of <xpath> - print copy of XPATH expression
+ -v or --value-of <xpath> - print value of XPATH expression
+ -o or --output <string> - output string literal
+ -n or --nl - print new line
+ -f or --inp-name - print input file name (or URL)
+ -m or --match <xpath> - match XPATH expression
+ --var <name> <value> --break or
+ --var <name>=<value> - declare a variable (referenced by $name)
+ -i or --if <test-xpath> - check condition <xsl:if test="test-xpath">
+ --elif <test-xpath> - check condition if previous conditions failed
+ --else - check if previous conditions failed
+ -e or --elem <name> - print out element <xsl:element name="name">
+ -a or --attr <name> - add attribute <xsl:attribute name="name">
+ -b or --break - break nesting
+ -s or --sort op xpath - sort in order (used after -m) where
+ op is X:Y:Z,
+ X is A - for order="ascending"
+ X is D - for order="descending"
+ Y is N - for data-type="numeric"
+ Y is T - for data-type="text"
+ Z is U - for case-order="upper-first"
+ Z is L - for case-order="lower-first"
+
+There can be multiple --match, --copy-of, --value-of, etc options
+in a single template. The effect of applying command line templates
+can be illustrated with the following XSLT analogue
+
+xml sel -t -c "xpath0" -m "xpath1" -m "xpath2" -v "xpath3" \
+ -t -m "xpath4" -c "xpath5"
+
+is equivalent to applying the following XSLT
+
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:template match="/">
+ <xsl:call-template name="t1"/>
+ <xsl:call-template name="t2"/>
+</xsl:template>
+<xsl:template name="t1">
+ <xsl:copy-of select="xpath0"/>
+ <xsl:for-each select="xpath1">
+ <xsl:for-each select="xpath2">
+ <xsl:value-of select="xpath3"/>
+ </xsl:for-each>
+ </xsl:for-each>
+</xsl:template>
+<xsl:template name="t2">
+ <xsl:for-each select="xpath4">
+ <xsl:copy-of select="xpath5"/>
+ </xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+
+
+
+
+3. Editing XML documents
+====================================================
+
+xml ed --help
+XMLStarlet Toolkit: Edit XML document(s)
+Usage: xml ed <global-options> {<action>} [ <xml-file-or-uri> ... ]
+where
+ <global-options> - global options for editing
+ <xml-file-or-uri> - input XML document file name/uri (stdin otherwise)
+
+<global-options> are:
+ -P, or -S - preserve whitespace nodes.
+ (or --pf, --ps) Note that space between attributes is not preserved
+ -O (or --omit-decl) - omit XML declaration (<?xml ...?>)
+ -L (or --inplace) - edit file inplace
+ -N <name>=<value> - predefine namespaces (name without 'xmlns:')
+ ex: xsql=urn:oracle-xsql
+ Multiple -N options are allowed.
+ -N options must be last global options.
+ --net - allow network access
+ --help or -h - display help
+
+where <action>
+ -d or --delete <xpath>
+ --var <name> <xpath>
+ -i or --insert <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
+ -a or --append <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
+ -s or --subnode <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
+ -m or --move <xpath1> <xpath2>
+ -r or --rename <xpath1> -v <new-name>
+ -u or --update <xpath> -v (--value) <value>
+ -x (--expr) <xpath>
+
+
+
+
+4. Using XSLT to transform XML documents
+====================================================
+
+xml tr --help
+XMLStarlet Toolkit: Transform XML document(s) using XSLT
+Usage: xml tr [<options>] <xsl-file> {-p|-s <name>=<value>} [<xml-file>...]
+where
+ <xsl-file> - main XSLT stylesheet for transformation
+ <xml-file> - input XML document file/URL (stdin is used if missing)
+ <name>=<value> - name and value of the parameter passed to XSLT processor
+ -p - parameter is XPATH expression ("'string'" to quote string)
+ -s - parameter is a string literal
+<options> are:
+ --help or -h - display help message
+ --omit-decl - omit xml declaration <?xml version="1.0"?>
+ --embed or -E - allow applying embedded stylesheet
+ --show-ext - show list of extensions
+ --val - allow validate against DTDs or schemas
+ --net - allow fetch DTDs or entities over network
+ --xinclude - do XInclude processing on document input
+ --maxdepth val - increase the maximum depth
+ --html - input document(s) is(are) in HTML format
+
+
+
+
+5. Formatting XML documents
+====================================================
+
+xml fo --help
+XMLStarlet Toolkit: Format XML document
+Usage: xml fo [<options>] <xml-file>
+where <options> are
+ -n or --noindent - do not indent
+ -t or --indent-tab - indent output with tabulation
+ -s or --indent-spaces <num> - indent output with <num> spaces
+ -o or --omit-decl - omit xml declaration <?xml version="1.0"?>
+ --net - allow network access
+ -R or --recover - try to recover what is parsable
+ -D or --dropdtd - remove the DOCTYPE of the input docs
+ -C or --nocdata - replace cdata section with text nodes
+ -N or --nsclean - remove redundant namespace declarations
+ -e or --encode <encoding> - output in the given encoding (utf-8, unicode...)
+ -H or --html - input is HTML
+ -Q or --quiet - Suppress errors from libxml2
+ -h or --help - print help
+
+
+
+
+6. Validating XML documents
+====================================================
+
+xml val --help
+XMLStarlet Toolkit: Validate XML document(s)
+Usage: xml val <options> [ <xml-file-or-uri> ... ]
+where <options>
+ -w or --well-formed - validate well-formedness only (default)
+ -d or --dtd <dtd-file> - validate against DTD
+ --net - allow network access
+ -s or --xsd <xsd-file> - validate against XSD schema
+ -E or --embed - validate using embedded DTD
+ -r or --relaxng <rng-file> - validate against Relax-NG schema
+ -e or --err - print verbose error messages on stderr
+ -b or --list-bad - list only files which do not validate
+ -g or --list-good - list only files which validate
+ -q or --quiet - do not list files (return result code only)
+
+NOTE: XML Schemas are not fully supported yet due to its incomplete
+ support in libxml2 (see http://xmlsoft.org)
+
+
+
+
+7. Displaying structure of XML documents
+====================================================
+
+xml el --help
+XMLStarlet Toolkit: Display element structure of XML document
+Usage: xml el [<options>] <xml-file>
+where
+ <xml-file> - input XML document file name (stdin is used if missing)
+ <options> is one of:
+ -a - show attributes as well
+ -v - show attributes and their values
+ -u - print out sorted unique lines
+ -d<n> - print out sorted unique lines up to depth <n>
+
+
+
+
+
+8. Escape/Unescape special XML characters
+====================================================
+
+xml esc --help
+XMLStarlet Toolkit: Escape special XML characters
+Usage: xml esc [<options>] [<string>]
+where <options> are
+ --help - print usage
+ (TODO: more to be added in future)
+if <string> is missing stdin is used instead.
+
+
+
+
+
+9. List directory as XML
+====================================================
+
+xml ls --help
+XMLStarlet Toolkit: List directory as XML
+Usage: xml ls [ <dir> | --help ]
+Lists current directory in XML format.
+Time is shown per ISO 8601 spec.
+
+
+
+
+
+10. XML canonicalization
+====================================================
+
+xml c14n --help
+XMLStarlet Toolkit: XML canonicalization
+Usage: xml c14n [--net] <mode> <xml-file> [<xpath-file>] [<inclusive-ns-list>]
+where
+ <xml-file> - input XML document file name (stdin is used if '-')
+ <xpath-file> - XML file containing XPath expression for
+ c14n XML canonicalization
+ Example:
+ <?xml version="1.0"?>
+ <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
+ (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
+ </XPath>
+
+ <inclusive-ns-list> - the list of inclusive namespace prefixes
+ (only for exclusive canonicalization)
+ Example: 'n1 n2'
+
+ <mode> is one of following:
+ --with-comments XML file canonicalization w comments (default)
+ --without-comments XML file canonicalization w/o comments
+ --exc-with-comments Exclusive XML file canonicalization w comments
+ --exc-without-comments Exclusive XML file canonicalization w/o comments
+
+
+
+
+
+11. Convert XML into PYX format (based on ESIS - ISO 8879)
+====================================================
+
+xml pyx --help
+XMLStarlet Toolkit: Convert XML into PYX format (based on ESIS - ISO 8879)
+Usage: xml pyx {<xml-file>}
+where
+ <xml-file> - input XML document file name (stdin is used if missing)
+
+The PYX format is a line-oriented representation of
+XML documents that is derived from the SGML ESIS format.
+(see ESIS - ISO 8879 Element Structure Information Set spec,
+ISO/IEC JTC1/SC18/WG8 N931 (ESIS))
+
+A non-validating, ESIS generating tool originally developed for
+pyxie project (see http://pyxie.sourceforge.net/)
+ESIS Generation by Sean Mc Grath http://www.digitome.com/sean.html
+
+
+
+
+
+12. Examples:
+====================================================
+
+Input1
+examples/xml/table.xml
+
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Input2
+examples/xml/tab-obj.xml
+
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <object name="Obj1">
+ <property name="size">10</property>
+ <property name="type">Data</property>
+ </object>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Input3
+examples/html/hello1.html
+
+<html>
+<head>
+ <title>Hello World</title>
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+</head>
+<body>
+ <div align="center">Hello World!<br></div>
+</body>
+</html>
+
+
+
+Input4
+examples/sgml/docbook1.sgml
+
+<!DOCTYPE book
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
+<book>
+
+ <bookinfo>
+ <title>DocBook document example</title>
+ <author>
+ <firstname>Mikhail</firstname>
+ <surname>Grushinskiy</surname>
+ </author>
+
+ <copyright>
+ <year>2002</year>
+ <holder>Mikhail Grushinskiy</holder>
+ </copyright>
+ </bookinfo>
+
+ <preface>
+ <title>Sample document</title>
+
+ <para>A simple DocBook example document.</para>
+ </preface>
+
+ <chapter>
+ <title>XMLStarlet Example</title>
+
+ <para>The <emphasis>XMLStarlet</emphasis> command line toolkit
+ allows querying/checking/editing/transforming/formatting XML documents
+ from command line</para>
+
+ <para>To find out more on how to use the
+ <emphasis>XMLStarlet</emphasis> for XML processing, point
+ your browser to <ulink
+ url="http://xmlstar.sourceforge.net/">http://xmlstar.sourceforge.net/</ulink>.
+ </para>
+
+ </chapter>
+
+</book>
+
+
+
+Stylesheet1
+examples/xsl/sum1.xsl
+
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+<xsl:param name="inputFile">-</xsl:param>
+<xsl:template match="/">
+ <xsl:call-template name="t1"/>
+</xsl:template>
+<xsl:template name="t1">
+ <xsl:value-of select="sum(/xml/table/rec/numField)"/>
+ <xsl:value-of select="'&#10;'"/>
+</xsl:template>
+</xsl:stylesheet>
+
+
+Stylesheet2
+examples/xsl/hello1.xsl
+
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+<xsl:param name="inputFile">-</xsl:param>
+<xsl:template match="/">
+ <xsl:call-template name="t1"/>
+</xsl:template>
+<xsl:template name="t1">
+ <xsl:for-each select="/">
+ <xsl:value-of select="/html/body/div"/>
+ </xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+
+
+Stylesheet3
+examples/xsl/param1.xsl
+
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+<xsl:param name="Text"/>
+<xsl:param name="Count"/>
+<xsl:template match="/">
+ <xsl:call-template name="t1"/>
+</xsl:template>
+<xsl:template name="t1">
+ <xsl:for-each select="/xml">
+ <xsl:value-of select="$Text"/>
+ <xsl:value-of select="$Count"/>
+ <xsl:value-of select="'&#10;'"/>
+ </xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
+
+
+
+Command:
+# XML canonicalization
+xml c14n --with-comments ../examples/xml/structure.xml ; echo $?
+Result Output:
+<a1>
+ <a11>
+ <a111>
+ <a1111></a1111>
+ </a111>
+ <a112>
+ <a1121></a1121>
+ </a112>
+ </a11>
+ <a12></a12>
+ <a13>
+ <a131></a131>
+ </a13>
+</a1>0
+
+
+Command:
+# XML exclusive canonicalization
+xml c14n --exc-with-comments ../examples/xml/c14n.xml ../examples/xml/c14n.xpath
+Result Output:
+<n1:elem1 xmlns:n1="http://b.example">
+content
+</n1:elem1>
+
+Command:
+# Count elements matching XPath expression
+xml sel -t -v "count(/xml/table/rec/numField)" xml/table.xml
+Result Output:
+3
+
+
+Command:
+# Count all nodes in XML document
+xml sel -t -f -o " " -v "count(//node())" xml/table.xml xml/tab-obj.xml
+Result Output:
+xml/table.xml 32
+xml/tab-obj.xml 41
+
+
+Command:
+# Delete elements matching XPath expression
+xml ed -d /xml/table/rec[@id='2'] xml/table.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+# Generate HTML from given SGML docbook document
+xml tr --omit-decl --docbook /usr/share/sgml/docbook/yelp/docbook/html/docbook.xsl sgml/docbook1.sgml | \
+ xml fo --html --indent-spaces 2
+Result Output:
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+ <head>
+ <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type"/>
+ <title>DocBook document example</title>
+ <meta name="generator" content="DocBook XSL Stylesheets V1.48"/>
+ </head>
+ <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+ <div class="book">
+ <div class="titlepage">
+ <div>
+ <h1 class="title"><a name="id2765244"/>DocBook document example</h1>
+ </div>
+ <div>
+ <h3 class="author">Mikhail Grushinskiy</h3>
+ </div>
+ <div>
+ <p class="copyright">Copyright © 2002 Mikhail Grushinskiy</p>
+ </div>
+ <hr/>
+ </div>
+ <div class="toc">
+ <p>
+ <b>Table of Contents</b>
+ </p>
+ <dl>
+ <dt>
+ <a href="#id2765482">Sample document</a>
+ </dt>
+ <dt>1. <a href="#id2767329">XMLStarlet Example</a></dt>
+ </dl>
+ </div>
+ <div class="preface">
+ <div class="titlepage">
+ <div>
+ <h2 class="title"><a name="id2765482"/>Sample document</h2>
+ </div>
+ </div>
+ <p>A simple DocBook example document.</p>
+ </div>
+ <div class="chapter">
+ <div class="titlepage">
+ <div>
+ <h2 class="title"><a name="id2767329"/>Chapter 1. XMLStarlet Example</h2>
+ </div>
+ </div>
+ <p>The <span class="emphasis"><i>XMLStarlet</i></span> command line toolkit
+ allows querying/checking/editing/transforming/formatting XML documents
+ from command line</p>
+ <p>To find out more on how to use the
+ <span class="emphasis"><i>XMLStarlet</i></span> for XML processing, point
+ your browser to <a href="http://xmlstar.sourceforge.net/" target="_top">http://xmlstar.sourceforge.net/</a>.
+ </p>
+ </div>
+ </div>
+ </body>
+</html>
+
+
+Command:
+# Validate XML document against DTD
+xml val --dtd dtd/table.dtd xml/tab-obj.xml >/dev/null 2>&1; echo $?
+Result Output:
+1
+
+
+Command:
+# Validate XML document against DTD
+xml val --dtd dtd/table.dtd xml/table.xml >/dev/null 2>&1; echo $?
+Result Output:
+0
+
+
+Command:
+# Validate XML document against DTD
+xml val --dtd xml/foo.dtd xml/foo.xml 2>/dev/null
+Result Output:
+xml/foo.xml - invalid
+
+
+Command:
+# make sure we don't look for embedded dtd if not asked
+xml val --dtd dtd/table.dtd xml/table.xml
+Result Output:
+xml/table.xml - valid
+
+
+Command:
+xml ed \
+ -s /xml/table/rec -t elem -n new-field -v new-value \
+ -i '$prev' -t attr -n new-attr -v new-attr-value \
+ xml/table.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <new-field new-attr="new-attr-value">new-value</new-field>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ <new-field new-attr="new-attr-value">new-value</new-field>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ <new-field new-attr="new-attr-value">new-value</new-field>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+xml ed \
+ -s /xml/table/rec -t elem -n new-field -v new-value \
+ --var new-field '$prev' \
+ -i '$new-field' -t attr -n new-attr -v new-attr-value \
+ -s '$new-field' -t elem -n new-subelem -v '' \
+ xml/table.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <new-field new-attr="new-attr-value">new-value<new-subelem/></new-field>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ <new-field new-attr="new-attr-value">new-value<new-subelem/></new-field>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ <new-field new-attr="new-attr-value">new-value<new-subelem/></new-field>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+# Display element structure of XML document
+xml el ./xml/tab-obj.xml
+Result Output:
+xml
+xml/table
+xml/table/rec
+xml/table/rec/numField
+xml/table/rec/stringField
+xml/table/rec/object
+xml/table/rec/object/property
+xml/table/rec/object/property
+xml/table/rec
+xml/table/rec/numField
+xml/table/rec/stringField
+xml/table/rec
+xml/table/rec/numField
+xml/table/rec/stringField
+
+
+Command:
+# Display element structure of XML document (including attributes)
+xml el -a ./xml/tab-obj.xml
+Result Output:
+xml
+xml/table
+xml/table/rec
+xml/table/rec/@id
+xml/table/rec/numField
+xml/table/rec/stringField
+xml/table/rec/object
+xml/table/rec/object/@name
+xml/table/rec/object/property
+xml/table/rec/object/property/@name
+xml/table/rec/object/property
+xml/table/rec/object/property/@name
+xml/table/rec
+xml/table/rec/@id
+xml/table/rec/numField
+xml/table/rec/stringField
+xml/table/rec
+xml/table/rec/@id
+xml/table/rec/numField
+xml/table/rec/stringField
+
+
+Command:
+# Display element structure of XML document (including attribute values)
+xml el -v ./xml/tab-obj.xml
+Result Output:
+xml
+xml/table
+xml/table/rec[@id='1']
+xml/table/rec/numField
+xml/table/rec/stringField
+xml/table/rec/object[@name='Obj1']
+xml/table/rec/object/property[@name='size']
+xml/table/rec/object/property[@name='type']
+xml/table/rec[@id='2']
+xml/table/rec/numField
+xml/table/rec/stringField
+xml/table/rec[@id='3']
+xml/table/rec/numField
+xml/table/rec/stringField
+
+
+Command:
+# Escape special XML characters
+cat xml/structure.xml | xml esc
+Result Output:
+&lt;a1&gt;
+ &lt;a11&gt;
+ &lt;a111&gt;
+ &lt;a1111/&gt;
+ &lt;/a111&gt;
+ &lt;a112&gt;
+ &lt;a1121/&gt;
+ &lt;/a112&gt;
+ &lt;/a11&gt;
+ &lt;a12/&gt;
+ &lt;a13&gt;
+ &lt;a131/&gt;
+ &lt;/a13&gt;
+&lt;/a1&gt;
+
+
+Command:
+# Calculate EXSLT (XSLT extentions) XPath value
+echo "<x/>" | xml sel -t -v "math:abs(-1000)"
+Result Output:
+1000
+
+
+Command:
+# Find XML files matching XPath expression (containing 'object' element)
+xml sel -t -m //object -f xml/table.xml xml/tab-obj.xml
+Result Output:
+xml/tab-obj.xml
+
+
+Command:
+# Generate XML document using command line xml sel
+echo "<x/>" | xml sel -t -m / -e xml -e child -a data -o value
+Result Output:
+<xml><child data="value"/></xml>
+
+
+Command:
+# Apply XSLT stylesheet to HTML input file
+xml tr --html xsl/hello1.xsl html/hello1.html
+Result Output:
+Hello World!
+
+Command:
+# Use local-name() XSLT function in XPath expression
+xml sel -t -v "//*[local-name()='query']" xsql/jobserve.xsql
+Result Output:
+
+ SELECT substr(title,1,26) short_title, title, location, skills
+ FROM job
+ WHERE UPPER(title) LIKE '%ORACLE%'
+ ORDER BY first_posted DESC
+
+
+
+Command:
+# Select text value of an XML element mathing given XPath expression
+xml sel -t -m "/xml/table/rec[@id='2']" -v numField xml/table.xml
+Result Output:
+346
+
+
+Command:
+# Move element node
+echo '<x id="1"><a/><b/></x>' | xml ed -m "//b" "//a"
+
+Result Output:
+<?xml version="1.0"?>
+<x id="1">
+ <a>
+ <b/>
+ </a>
+</x>
+
+
+Command:
+# Format XML document disabling indent
+cat xml/tab-obj.xml | xml fo --noindent
+Result Output:
+<?xml version="1.0"?>
+<xml>
+<table>
+<rec id="1">
+<numField>123</numField>
+<stringField>String Value</stringField>
+<object name="Obj1">
+<property name="size">10</property>
+<property name="type">Data</property>
+</object>
+</rec>
+<rec id="2">
+<numField>346</numField>
+<stringField>Text Value</stringField>
+</rec>
+<rec id="3">
+<numField>-23</numField>
+<stringField>stringValue</stringField>
+</rec>
+</table>
+</xml>
+
+
+Command:
+# Predefine namespaces for XPath expressions
+xml sel -N xsql=urn:oracle-xsql -t -v /xsql:query xsql/jobserve.xsql
+Result Output:
+
+ SELECT substr(title,1,26) short_title, title, location, skills
+ FROM job
+ WHERE UPPER(title) LIKE '%ORACLE%'
+ ORDER BY first_posted DESC
+
+
+
+Command:
+# Recover malformed XML document
+xml fo -R xml/malformed.xml 2>/dev/null
+Result Output:
+<?xml version="1.0"?>
+<test_output>
+ <test_name>foo</test_name>
+ <subtest>...</subtest>
+</test_output>
+
+
+Command:
+# Rename attributes
+xml ed -r "//*/@id" -v ID xml/tab-obj.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec ID="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <object name="Obj1">
+ <property name="size">10</property>
+ <property name="type">Data</property>
+ </object>
+ </rec>
+ <rec ID="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </rec>
+ <rec ID="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+# Rename elements
+xml ed -r "/xml/table/rec" -v record xml/tab-obj.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <record id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <object name="Obj1">
+ <property name="size">10</property>
+ <property name="type">Data</property>
+ </object>
+ </record>
+ <record id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </record>
+ <record id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </record>
+ </table>
+</xml>
+
+
+Command:
+# Validate against XSD schema
+xml val -b -s xsd/table.xsd xml/table.xml xml/tab-obj.xml 2>/dev/null; echo $?
+Result Output:
+xml/tab-obj.xml
+1
+
+
+Command:
+# xsl:copy-of in xml sel command
+xml sel -B -t -m /xml/table/rec -c . -n xml/table.xml
+Result Output:
+<rec id="1"><numField>123</numField><stringField>String Value</stringField></rec>
+<rec id="2"><numField>346</numField><stringField>Text Value</stringField></rec>
+<rec id="3"><numField>-23</numField><stringField>stringValue</stringField></rec>
+
+
+
+Command:
+# Query XML document and produce sorted text table
+xml sel -T -t -m /xml/table/rec -s D:N:- "@id" -v "concat(@id,'|',numField,'|',stringField)" -n xml/table.xml
+Result Output:
+3|-23|stringValue
+2|346|Text Value
+1|123|String Value
+
+
+Command:
+# Sort on two fields
+xml sel -T -t -m /root/elem -s A:N:U @rank -s A:T:U @name -v @name -n xml/unsorted.xml
+
+Result Output:
+A
+a
+E
+e
+B
+b
+C
+c
+D
+d
+
+
+Command:
+# lower case first
+xml sel -T -t -m /root/elem -s A:T:L @name -v @name -n xml/unsorted.xml
+
+Result Output:
+a
+A
+b
+B
+c
+C
+d
+D
+e
+E
+
+
+Command:
+# Print structure of XML element using xml sel (advanced XPath expressions and xml sel command usage)
+xml sel -T -t -m '//*' \
+-m 'ancestor-or-self::*' -v 'name()' -i 'not(position()=last())' -o . -b -b -n \
+xml/structure.xml
+Result Output:
+a1
+a1.a11
+a1.a11.a111
+a1.a11.a111.a1111
+a1.a11.a112
+a1.a11.a112.a1121
+a1.a12
+a1.a13
+a1.a13.a131
+
+
+Command:
+# Calculating running sum on XML document
+xml sel -t -v "sum(/xml/table/rec/numField)" xml/table.xml
+Result Output:
+446
+
+
+Command:
+# Indent XML document with tabs
+cat xml/tab-obj.xml | xml fo --indent-tab
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <object name="Obj1">
+ <property name="size">10</property>
+ <property name="type">Data</property>
+ </object>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+# Generate plain text table from XML document
+xml sel -T -t -m /xml/table/rec -v "@id" -o "|" -v numField -o "|" -v stringField -n xml/table.xml
+Result Output:
+1|123|String Value
+2|346|Text Value
+3|-23|stringValue
+
+
+Command:
+# Generate plain text table from XML document
+xml sel -T -t -m /xml/table/rec -v "concat(@id,'|',numField,'|',stringField)" -n xml/table.xml
+Result Output:
+1|123|String Value
+2|346|Text Value
+3|-23|stringValue
+
+
+Command:
+# Generate plain text table from XML document
+xml sel -T \
+ -t -o "===================" -n \
+ -m xml/table/rec -v "concat(@id,'|',numField,'|',stringField)" -n \
+ -t -o "===================" -n xml/table.xml
+Result Output:
+===================
+1|123|String Value
+2|346|Text Value
+3|-23|stringValue
+===================
+
+
+Command:
+# Print subtree of elements having given element as a descendant (advanced XPath)
+xml ed -d '//node()[not(descendant-or-self::isbn or parent::isbn)] | //*[parent::isbn]' xml/books.xml
+
+Result Output:
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<books>
+ <book type="hardback">
+ <isbn id="1">0525934189</isbn>
+ </book>
+ <book type="paperback">
+ <isbn id="2">0140185399</isbn>
+ </book>
+</books>
+
+
+Command:
+# Select from XML document containing unicode characters
+xml sel -T -t -m "//test[@lang='français']/@lang" -v . -n xml/unicode.xml
+Result Output:
+français
+français
+français
+
+
+Command:
+# Update value of an attribute
+xml ed -u '/xml/table/rec[@id=3]/@id' -v 5 xml/tab-obj.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>123</numField>
+ <stringField>String Value</stringField>
+ <object name="Obj1">
+ <property name="size">10</property>
+ <property name="type">Data</property>
+ </object>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </rec>
+ <rec id="5">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+# Update value of an element
+xml ed -u '/xml/table/rec[@id=1]/numField' -v 0 xml/tab-obj.xml
+Result Output:
+<?xml version="1.0"?>
+<xml>
+ <table>
+ <rec id="1">
+ <numField>0</numField>
+ <stringField>String Value</stringField>
+ <object name="Obj1">
+ <property name="size">10</property>
+ <property name="type">Data</property>
+ </object>
+ </rec>
+ <rec id="2">
+ <numField>346</numField>
+ <stringField>Text Value</stringField>
+ </rec>
+ <rec id="3">
+ <numField>-23</numField>
+ <stringField>stringValue</stringField>
+ </rec>
+ </table>
+</xml>
+
+
+Command:
+# Validate XML documents using well-formedness/DTD/XSD/RelaxNG checks
+echo "==============================================="
+echo "Well-Formedness Validation Tests"
+echo "- 1 -------------------------------------------"
+xml val xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 2 -------------------------------------------"
+xml val -g xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 3 -------------------------------------------"
+xml val -b xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 4 -------------------------------------------"
+xml val -q xml/table.xml xml/tab-obj.xml 2>/dev/null; echo $?
+
+echo "==============================================="
+echo "DTD Validation Tests"
+echo "- 1 -------------------------------------------"
+xml val -d dtd/table.dtd xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 2 -------------------------------------------"
+xml val -g -d dtd/table.dtd xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 3 -------------------------------------------"
+xml val -b -d dtd/table.dtd xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 4 -------------------------------------------"
+xml val -q -d dtd/table.dtd xml/table.xml 2>/dev/null; echo $?
+
+echo "==============================================="
+echo "Schema Validation Tests"
+echo "- 1 -------------------------------------------"
+xml val -s xsd/table.xsd xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 2 -------------------------------------------"
+xml val -g -s xsd/table.xsd xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 3 -------------------------------------------"
+xml val -b -s xsd/table.xsd xml/table.xml xml/tab-obj.xml xml/tab-bad.xml 2>/dev/null; echo $?
+echo "- 4 -------------------------------------------"
+xml val -q -s xsd/table.xsd xml/table.xml 2>/dev/null; echo $?
+
+echo "==============================================="
+echo "RelaxNG Schema Validation Tests"
+echo "- 1 -------------------------------------------"
+xml val -r relaxng/address.rng relaxng/address.xml relaxng/address-bad.xml 2>/dev/null; echo $?
+echo "- 2 -------------------------------------------"
+xml val -g -r relaxng/address.rng relaxng/address.xml relaxng/address-bad.xml 2>/dev/null; echo $?
+echo "- 3 -------------------------------------------"
+xml val -b -r relaxng/address.rng relaxng/address.xml relaxng/address-bad.xml 2>/dev/null; echo $?
+echo "- 4 -------------------------------------------"
+xml val -q -r relaxng/address.rng relaxng/address.xml 2>/dev/null; echo $?
+Result Output:
+===============================================
+Well-Formedness Validation Tests
+- 1 -------------------------------------------
+xml/table.xml - valid
+xml/tab-obj.xml - valid
+xml/tab-bad.xml - invalid
+1
+- 2 -------------------------------------------
+xml/table.xml
+xml/tab-obj.xml
+1
+- 3 -------------------------------------------
+xml/tab-bad.xml
+1
+- 4 -------------------------------------------
+0
+===============================================
+DTD Validation Tests
+- 1 -------------------------------------------
+xml/table.xml - valid
+xml/tab-obj.xml - invalid
+xml/tab-bad.xml - invalid
+1
+- 2 -------------------------------------------
+xml/table.xml
+1
+- 3 -------------------------------------------
+xml/tab-obj.xml
+xml/tab-bad.xml
+1
+- 4 -------------------------------------------
+0
+===============================================
+Schema Validation Tests
+- 1 -------------------------------------------
+xml/table.xml - valid
+xml/tab-obj.xml - invalid
+xml/tab-bad.xml - invalid
+1
+- 2 -------------------------------------------
+xml/table.xml
+1
+- 3 -------------------------------------------
+xml/tab-obj.xml
+xml/tab-bad.xml
+1
+- 4 -------------------------------------------
+0
+===============================================
+RelaxNG Schema Validation Tests
+- 1 -------------------------------------------
+relaxng/address.xml - valid
+relaxng/address-bad.xml - invalid
+1
+- 2 -------------------------------------------
+relaxng/address.xml
+1
+- 3 -------------------------------------------
+relaxng/address-bad.xml
+1
+- 4 -------------------------------------------
+0
+
+
+Command:
+# Include one XML document into another using XInclude
+xml tr --xinclude xsl/cat.xsl xml/document.xml
+Result Output:
+<?xml version="1.0" encoding="utf-8"?>
+<document xmlns:xi="http://www.w3.org/2003/XInclude">
+ <p>120 Mz is adequate for an average home user.</p>
+ <disclaimer>
+ <p>The opinions represented herein represent those of the individual
+ and should not be interpreted as official policy endorsed by this
+ organization.</p>
+</disclaimer>
+</document>
+
+
+Command:
+# Passing parameters to XSLT stylesheet
+xml tr xsl/param1.xsl -p Count='count(/xml/table/rec)' -s Text="Count=" xml/table.xml
+Result Output:
+Count=3
+
+
+Command:
+# Applying XSLT stylesheet to XML document
+xml tr xsl/sum1.xsl xml/table.xml
+Result Output:
+446
+
+
+