operator
~ expression
The identity operator is used to disambiguate an expression in certain contexts where the same expression could be interpreted in multiple ways. This is necessary when using an expression inside a pattern or inside of an element context test.
You can use the identity operator (~) to force an expression contained in a pattern to be evaluated so that the result of the expression becomes part of the pattern. This is only necessary for expressions which are ambiguous in their syntax, so that OmniMark cannot tell, without the identity operator, whether the expression is a value expression to be evaluated or a sequence of pattern expressions.
The identity operator is required in shelf names with indexers. This is to distinguish between braces used as shelf key indexers and braces used in patterns, and between square brackets used as shelf item indexers and square brackets used to define character classes in pattern matching. Thus, you must use the identity operator to match an item on a shelf, or its key:
find ~foo[2] find ~foo{"bar"}
The identity operator can be used to specify an expression that generates the name of an element in an element context test or an element qualifier. The element context tests are
The relevant element qualifiers are
When used in this fashion, the argument of the identity operator
should be a string
, or an expression convertible to a string
.
As an example, the following program outputs a message only when the
name of the parent of the current element is the content of the string
shelf s
(i.e., a
):
global string s initial { "a" } process do xml-parse scan "<a><b><c/></b></a>" output "%c" done element #implied output "%c" output "Hello, World!%n" when parent is ~s
The identity operator is required in the parent is
element context
text because, without it, the identifier s
would be interpreted as the
name of the element, rather than as the name of the string
shelf s
.