This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Re: XPath iteration?
- From: Dimitre Novatchev <dnovatchev at yahoo dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Fri, 12 Jul 2002 08:01:28 -0700 (PDT)
- Subject: Re: Re: [xsl] XPath iteration?
- Reply-to: xsl-list at lists dot mulberrytech dot com
--- Derek Davies <ddavies at itasoftware dot com> wrote:
>
> Jeni Tennison <jeni@jenitennison.com> 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