Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > XML > Distinguish between empty string and no children, in XPath 2?

Reply
Thread Tools

Distinguish between empty string and no children, in XPath 2?

 
 
Arndt Jonasson
Guest
Posts: n/a
 
      09-05-2008

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.

With XPath 1.0, this is not possible, since schema information is not
used there. But can it be done in XPath 2.0? I find the standard
document a bit forbidding, although I'm fairly well acquainted with
the 1.0 document.

We would like to add such capability to the XPath 1.0 implementation
in our application (which does have access to the schema), and if
XPath 2.0 offers a way to express it, it seems best not to reinvent
anything, hence this question.

 
Reply With Quote
 
 
 
 
Martin Honnen
Guest
Posts: n/a
 
      09-05-2008
Arndt Jonasson wrote:
> 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.
>
> With XPath 1.0, this is not possible, since schema information is not
> used there. But can it be done in XPath 2.0? I find the standard
> document a bit forbidding, although I'm fairly well acquainted with
> the 1.0 document.


Even in the XSLT 2.0 data model the txt element has a child node, it is
a text child node. So your description of saying does not have "children
in the schema" is not very precise. Are you looking for elements which
have a simple type in the meaning of the W3C schema language, meaning
they have no child _elements_ and no attributes? I am not sure whether
schema aware XSLT 2.0 allows you do detect elements which have a simple
type respectively do distinguish in your stylesheet between elements
having a simple type and those having a complex type. As far as I know
all you can do is match an element based on its type and validate input
or output elements based on a schema.

You might want to ask on the XSL mailing list
http://www.mulberrytech.com/xsl/xsl-list/, spec writers and implementors
like Michael Kay are regulars there so you should get a more qualified
answer there than here.



--

Martin Honnen
http://JavaScript.FAQTs.com/
 
Reply With Quote
 
 
 
 
Martin Honnen
Guest
Posts: n/a
 
      09-05-2008
Arndt Jonasson wrote:
> 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.
>
> With XPath 1.0, this is not possible, since schema information is not
> used there. But can it be done in XPath 2.0? I find the standard
> document a bit forbidding, although I'm fairly well acquainted with
> the 1.0 document.


Even in the XSLT 2.0 data model the txt element has a child node, it is
a text child node. So your description of saying does not have "children
in the schema" is not very precise. Are you looking for elements which
have a simple type in the meaning of the W3C schema language, meaning
they have no child _elements_ and no attributes? I am not sure whether
schema aware XSLT 2.0 allows you do detect elements which have a simple
type respectively do distinguish in your stylesheet between elements
having a simple type and those having a complex type. As far as I know
all you can do is match an element based on its type and validate input
or output elements based on a schema.

You might want to ask on the XSL mailing list
http://www.mulberrytech.com/xsl/xsl-list/, spec writers and implementors
like Michael Kay are regulars there so you should get a more qualified
answer there than here.



--

Martin Honnen
http://JavaScript.FAQTs.com/
 
Reply With Quote
 
Arndt Jonasson
Guest
Posts: n/a
 
      09-05-2008
On Sep 5, 2:00 pm, Martin Honnen <mahotr...@yahoo.de> wrote:

> Even in the XSLT 2.0 data model the txt element has a child node, it is
> a text child node. So your description of saying does not have "children
> in the schema" is not very precise. Are you looking for elements which
> have a simple type in the meaning of the W3C schema language, meaning
> they have no child _elements_ and no attributes?


Yes, I mistakenly left out the word "element".

> You might want to ask on the XSL mailing listhttp://www.mulberrytech.com/xsl/xsl-list/, spec writers and implementors
> like Michael Kay are regulars there so you should get a more qualified
> answer there than here.


Thanks, I'll try there.
 
Reply With Quote
 
Arndt Jonasson
Guest
Posts: n/a
 
      09-05-2008
On Sep 5, 2:00 pm, Martin Honnen <mahotr...@yahoo.de> wrote:

> Even in the XSLT 2.0 data model the txt element has a child node, it is
> a text child node. So your description of saying does not have "children
> in the schema" is not very precise. Are you looking for elements which
> have a simple type in the meaning of the W3C schema language, meaning
> they have no child _elements_ and no attributes?


Yes, I mistakenly left out the word "element".

> You might want to ask on the XSL mailing listhttp://www.mulberrytech.com/xsl/xsl-list/, spec writers and implementors
> like Michael Kay are regulars there so you should get a more qualified
> answer there than here.


Thanks, I'll try there.
 
Reply With Quote
 
Dimitre Novatchev
Guest
Posts: n/a
 
      09-07-2008

"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









 
Reply With Quote
 
Dimitre Novatchev
Guest
Posts: n/a
 
      09-07-2008

"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









 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
It seems that XPath does not distinguish between an inexistent pathand a null string? Ramon F Herrera XML 13 06-28-2012 01:14 PM
Distinguish between empty string and no children, in XPath 2? Arndt Jonasson XML 0 09-05-2008 11:30 AM
behavior varied between empty string '' and empty list [] Tzury Bar Yochay Python 1 03-24-2008 06:56 PM
distinguish between char* and char[x] mosfet C++ 6 11-27-2003 01:28 AM
How to distinguish between Olympus refurbished and new? Jerry Nash Digital Photography 4 11-19-2003 05:22 PM



Advertisments