Subject: Re: XPath Predicate Nuance
From: "David P. Nesbitt" <david_p_nesbitt@xxxxxxxxx>
Date: Wed, 6 Oct 2004 18:08:22 -0700 (PDT)
|
Ken,
Thanks a bunch for the help. I really appreciate it.
Regards,
Dave
--- "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
wrote:
> At 2004-10-06 15:13 -0700, David P. Nesbitt wrote:
> >I am getting some unexpect results from an XPath
> >predicate.
>
> Yours is a common mistake made by my students who
> have looked at XPath
> before taking a class.
>
> >I am trying to load the unique values of
> >an element into a variable. The XML file is
> grouped
> >by this element. I want to treat the absence of
> the
> >element as a value as well (the "null" value if you
> >will). However, I can't get the XPath predicate to
> >filter out multiple "null" values.
>
> You are forgetting that "preceding-sibling::" looks
> at *all* preceding
> siblings, not just the closest preceding sibling.
>
> >I am including below a data file, stylesheet,
> expected
> >output and observed output.
>
> Thank you, that made it easy to modify to illustrate
> the fix.
>
> >If you can see anything
> >wrong, I would most appreciate your assistance.
>
> Use a predicate "[1]" to talk about the immediately
> preceding sibling, not
> *all* preceding siblings.
>
> I hope this helps.
>
> .................... Ken
>
> p.s. your use of boolean() on a node set is
> redundant ... the processor is
> already converting both operands to boolean when the
> operator is boolean.
>
> T:\ftemp>type nesbitt.xml
> <a>
> <b>
> <c>123</c>
> <d>000</d>
> </b>
> <b>
> <c>123</c>
> <d>000</d>
> </b>
> <b>
> <d>000</d>
> </b>
> <b>
> <d>000</d>
> </b>
> <b>
> <c>456</c>
> <d>000</d>
> </b>
> <b>
> <c>456</c>
> <d>000</d>
> </b>
> <b>
> <c>789</c>
> <d>000</d>
> </b>
> </a>
>
> T:\ftemp>type nesbitt.xsl
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:fo="http://www.w3.org/1999/XSL/Format">
> <xsl:output method="text"/>
> <xsl:template match="a">
> <xsl:variable name="unique-cs"
> select="/a/b[(not(preceding-sibling::b) or
> (not(c) and preceding-sibling::b[1]/c)
> or
> (c and
> not(c=preceding-sibling::b[1]/c)))]"/>
> <xsl:for-each select="$unique-cs">
> <xsl:value-of select="c"/>
> <xsl:text>
> </xsl:text>
> </xsl:for-each>
> </xsl:template>
> </xsl:stylesheet>
>
> T:\ftemp>saxon nesbitt.xml nesbitt.xsl
> 123
>
> 456
> 789
>
> T:\ftemp>
>
> --
> Upcoming publicly-subscribed XSL delivery: Helsinki
> Oct 18-20,2004
> World-wide on-site corporate, govt. & user group
> XML/XSL training.
> G. Ken Holman
> mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
> Crane Softwrights Ltd.
> http://www.CraneSoftwrights.com/s/
> Box 266, Kars, Ontario CANADA K0A-2E0
> +1(613)489-0999 (F:-0995)
> Male Breast Cancer Awareness
> http://www.CraneSoftwrights.com/s/bc
> Legal business disclaimers:
> http://www.CraneSoftwrights.com/legal
>
>
_______________________________
Do you Yahoo!?
Declare Yourself - Register online to vote today!
http://vote.yahoo.com
|