Re: Re: [xsl] XPath iteration?

Subject: Re: Re: [xsl] XPath iteration?
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Fri, 12 Jul 2002 08:01:28 -0700 (PDT)
--- Derek Davies <ddavies at itasoftware dot com> wrote:
> 
> Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> writes:
> 
> > Hi Derek,
> > 
> > > I'm sorry if this question is inappropriate here, but I haven't
> > > found a more appropriate place to ask, nor have I found a FAQ
> that
> > > addresses my question.
> > 
> > Don't worry; this is a good place to ask your question.
> > 
> > > I'm trying to come up with an XPath expression that will
> "iterate".
> > > What I have in mind is something to the effect of:
> > >
> > >       /Root/SomeNode[position()!=position(/Root/SomeNode)]
> > >
> > > which would compare each SomeNode against all other SomeNode's
> > > except itself (there are multiple SomeNode children of /Root).
> > 
> > Given that all the SomeNode elements are siblings of each other,
> you
> > can collect together the other SomeNodes into a node set with:
> > 
> >   preceding-sibling::SomeNode | following-sibling::SomeNode
> > 
> > I don't know what you want to do with them, though -- perhaps you
> > could describe what you actually want to get from the XPath?
> > 
> 
> We've got a program that is used to test our XML output by using
> XPath
> to assert things about the output.  I have a situation where I want
> to
> use an XPath expression to ensure that no two sibling elements have
> the same content.  But I don't want to rely on the number of these
> siblings being constant across tests.
> 
> So in my example the number of SomeNode's can change over time but
> the test shouldn't have to adapt to that.  It should just ensure that
> the SomeNode contents are different.
> 
> Derek
> 

Hi Derek,

This can be achieved within a single XPath expression:

/*/*[not(. = preceding-sibling::* or . = following-sibling::*)]

gives all /*/* that do not have duplicate siblings.


To check whether all /*/* have unique values, use:

count(/*/*) = count(/*/*[not(. = preceding-sibling::* 
                       or . = following-sibling::*)
                        ]
                   )


Hope this helped.



=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

__________________________________________________
Do You Yahoo!?
Sign up for SBC Yahoo! Dial - First Month Free
http://sbc.yahoo.com

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


Current Thread