xsl-list
[Top] [All Lists]

Re: XPath Predicate Nuance

2004-10-06 17:28:28
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(_at_)CraneSoftwrights(_dot_)com
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



<Prev in Thread] Current Thread [Next in Thread>