Help | Site Map
Connecting Tech Pros Worldwide
 
 
LinkBack Thread Tools
  #1  
Old September 5th, 2008, 12:35 PM
Arndt Jonasson
Guest
 
Posts: n/a
Default Distinguish between empty string and no children, in XPath 2?


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.

  #2  
Old September 5th, 2008, 01:05 PM
Martin Honnen
Guest
 
Posts: n/a
Default Re: Distinguish between empty string and no children, in XPath 2?

Arndt Jonasson wrote:
Quote:
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/
  #3  
Old September 5th, 2008, 01:25 PM
Arndt Jonasson
Guest
 
Posts: n/a
Default Re: Distinguish between empty string and no children, in XPath 2?

On Sep 5, 2:00 pm, Martin Honnen <mahotr...@yahoo.dewrote:
Quote:
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".
Quote:
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.
  #4  
Old September 7th, 2008, 05:55 AM
Dimitre Novatchev
Guest
 
Posts: n/a
Default Re: Distinguish between empty string and no children, in XPath 2?


"Arndt Jonasson" <arndt.jonasson@gmail.comwrote in message
news:3d8ef72b-e938-482d-9c1c-43583584331a@z66g2000hsc.googlegroups.com...
Quote:
>
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









 

Bookmarks

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 Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over network members.
Post your question now . . .
It's fast and it's free

Popular Articles