|
Subject: RE: [xsl] recursive counter not incrementing From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Thu, 9 Dec 2004 10:05:23 -0000 |
> David
> Ultimately i am trying to check if the items in $s1 can also
> be found in $s2.
> For example -
> $s1 would consist of 2 items, $s1/item/Milk and $s1/item/Sugar
> $s2 would consist of 10 different items, Milk and Sugar are
> among them.
In predicate logic that's
for each ITEM1 in $s1
there exists ITEM2 in $s2
such that ITEM1 = ITEM2
or in XPath 2:
every $I1 in $s1 satisfies
some $I2 in $s2 satisfies
$I1 eq $I2
In XPath 1 the equivalent of "some" can be achieved with
$s2[predicate]
and the equivalent of "every" can be achieved with
not($s1[not(predicate)])
but without range variables, you can't combine the two conditions into a
single expression.
However, there's another tool in the kitbag: the "existential equals". The
"=" operator, and its friends, compare two sets, rather than just
singletons. A=B is true if some pair of items from A and B are equal
So you can write
not($s1[not(item = $s2/item)])
which I think tests the condition you are looking for.
Michael Kay
http://www.saxonica.com/
> I've accomplished this using the for-each loop you suggested, however
> i need a way to signal that ALL items have been found after the loop,
> and not only some of them.
>
> I'm thinking something like:
>
> <xsl:for-each select="$s1/item[.=$s2/item]">
> <!--now, try to place the items that it found matches for, into a
> nodeset and compare it to the original $s1 itemset. If the results
> from the for-each loop and the $s1 itemset contain the same items,
> output COMPLETE MATCH-->
>
> However, i'm not sure how to accomplish getting every matched item it
> finds into a nodeset of some sort that i can use for a comparison
> later on. Any help would be appreciated...I'm a beginner and
> frustration is setting in, but so far you guys have helped me a good
> deal. Thanks.
>
> Chris
>
> On Wed, 8 Dec 2004 22:41:37 GMT, David Carlisle
> <davidc@xxxxxxxxx> wrote:
> >
> > It's not clear why you are using recursion rather than just using
> > postion() or count to get this number, but perhaps that's
> just because
> > you have cut the example down, I didn't follow all the logic of your
> > stylesheet but can comment on some lines:
> >
> > <xsl:with-param name="s1"
> > select="$s1/item[following-sibling]"/>
> >
> > That selects all items that have a child called
> following-sibling so it
> > will be empty, I don't know which nodes you mean to select here but
> > perhaps
> > select="following-sibling::*"
> >
> > <xsl:for-each select="$s1/item">
> > <xsl:variable name="sub1" select="."/>
> >
> > <xsl:for-each select="$s2/item">
> > <xsl:if test="$sub1 = . ">
> >
> >
> > This is rather strange, it loops through all pairs of items in s1
> > and s1 but only does anything if the items are equal
> > so you could just select those pairs with a single xpath:
> > <xs:for-each select="$s2/item[.=$s1/item]">
> >
> > which is more compact to write and at least gives the
> system a chance of
> > being a bit more efficient.
> >
> > It seems that you want to use an integer counter as your
> main control
> > and repeatedly pass the whole of yor set $s1 and keep
> accessing $s1[$i]
> > this isn't the usual XSL way, normally you would just
> simply pass the
> > current node as a parameter, and then move control to teh following
> > sibling, without ever needing your integer position variable.
> >
> > David
> >
> >
> ______________________________________________________________
> __________
> > This e-mail has been scanned for all viruses by Star. The
> > service is powered by MessageLabs. For more information on
> a proactive
> > anti-virus service working around the clock, around the
> globe, visit:
> > http://www.star.net.uk
> >
> ______________________________________________________________
> __________
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] recursive counter not inc, Christopher Hansen | Thread | Re: [xsl] recursive counter not inc, David Carlisle |
| Re: [xsl] XSL-FO insert a blank lin, David Tolpin | Date | Re: [xsl] recursive counter not inc, David Carlisle |
| Month |