[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: XPath: better way to check for text nodes that are

Subject: RE: XPath: better way to check for text nodes that aren't descendents of x or y nodes?
From: "Lars Huttar" <lars_huttar@xxxxxxx>
Date: Wed, 14 May 2003 15:03:40 -0500
check node name xslt
Tom Passim wrote:
> You could use
> 
> test='not(.//*[local-name() != "vernac" and local-name() !=
> "gloss"]/text()[1]
> 		| text())'

Hmm... I don't think this would give the correct result in all cases,
e.g. if we have
  ./llcd:vernac/llcd:stretch/text()
this should be legal, but it would show up as illegal by your test.

> 
> or
> 
> test='count(.//*[local-name() != "vernac" and local-name() !=
> "gloss"]/text()[1]
> 		| text()) > 0'
> 
> These might be more efficient because you do not bother to examine
> elements that will not cause a false result, and of the ones that are
> examined, you only have to look at one text node.

That's the kind of solution I was hoping for...

> Whatever expression you use, remember to use 
> 
> <xsl:strip-space elements='*'/>
> 
> Otherwise you will be counting whitespace-only nodes between elements,
> which you most likely do not intend.

Thanks!  That may save me some grief.


Dmitre Novatchev wrote:
> Or quite more simple:
> 
>   count(.//text()) != count(.//*[self::llcd:vernac or
> self::llcd:gloss]//text())

Thanks... I had not thought to use *[self::llcd:vernac or
  self::llcd:gloss] in the middle.

Do you have any thoughts about the efficiency of a count() solution
vs. a count()-less solution like the following one?  (using "or" instead
of "|" as you suggest)

> > My current test is
> >  test=".//text()[not(ancestor::llcd:vernac | ancestor::llcd:gloss)]"
> 
> In the general case this is not correct, because it will 
> permit "illegal"
> text-nodes, which have an llcd:vernac or llcd:gloss ancestor, 
> which is not a
> descendent of the current node (but its ancestor).

In my first email I noted that
> (By the way, if it helps, the llcd:vernac or llcd:gloss will be descendants
> of . too, not ancestors.)
What I meant is that this constraint can be assumed
to be true already.  So there are no llcd:vernac or llcd:gloss ancestors
of the current node.

> Apart from this observation, a non-clever XSLT processor will 
> build the
> union in the predicate and this is quite expensive operation. 
> I think it
> would be more efficient to re-write the expression as:
> 
> .//text()[not(ancestor::llcd:vernac or ancestor::llcd:gloss)]

Thanks, that's helpful.
Sometimes I forget that | is really union and not just "or"!

Lars


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.