"Arndt Jonasson" <> wrote in message
news:3d8ef72b-e938-482d-9c1c-...
>
> Let's say we have a schema (maybe expressed in XML Schema, but not
> necessarily so), that allows this instance document:
>
> <top>
> <txt>This is text</txt>
> <books>
> <book>Tarzan</book>
> <book>Harry Potter</book>
> </books>
> </top>
>
> The text /top/txt may be empty, and the element /top/books may have no
> children, so this instance document is also allowed:
>
> <top>
> <txt/>
> <books/>
> </top>
>
> I now want to write an XPath expression that selects all nodes that do
> not have children in the schema. It would always select /top/txt and
> it would never select /top/books, even in the second example above.
>
This is possible in XPath 2.0 if the schema has separate types for all cases
of element that must not have children-elements.
Then one can use the so called ElementTest, which is defined in the
following way:
ElementTest ::= "element" "(" (ElementNameOrWildcard (","
TypeName "?"?)?)? ")"
One of the possible XPath 2.0 expressions will be something like the
following:
//element(*,Type1) | //element(*,Type2) | ... |
//element(*,TypeN)
where Type1, Type2, ..., typeN are all the schema types that define
elements that cannot have children-elements.
Probably substitution groups can be used so that all types above can be
derived from a single abstract type, let's say "ChildlessElement".
Then the expression would be simply:
//element(*,ChildlessElement)
Of course, to be able to evaluate such XPath 2.0 expressions one must have a
full-blown XPath 2.0 implementation (either a Schema-Aware XSLT 2.0
processor, or an XQuery processor)
For more information see the XPath 2.0 spec:
http://www.w3.org/TR/xpath20/#doc-xpath-ElementTest
http://www.w3.org/TR/xpath20/#id-element-test
Cheers,
Dimitre Novatchev