- From: Mukul Gandhi <mukul_gandhi@yahoo.com>
- Date: Mon, 21 Mar 2005 04:50:38 -0800 (PST)
- To: Sergio Andreozzi <sergio.andreozzi@cnaf.infn.it>, Michael Kay <mhk@mhk.me.uk>
- Cc: www-ql@w3.org
Is this a better XQuery .. <Results> { for $A in doc("data.xml")/ASet/A let $matches := $A[B = ("red","yellow")][C = ("chair","table")]/((B[.=("red","yellow")] | C[.=("chair","table")])) return if ($A/$matches) then <A> {$A/@*} {$matches} </A> else $A/$matches }</Results> I have one question.. Can we write if without else in XQuery? The XQuery grammer says: IfExpr ::= "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle This probably implies that else is mandatory in if. That is why I had to write a redundant.. else $A/$matches Saxon is not allowing if without else.. If else is mandatory, then is'nt it a inconvenience..? Regards, Mukul --- Sergio Andreozzi <sergio.andreozzi@cnaf.infn.it> wrote: > Hi Michael, > > Michael Kay wrote: > > Here's a solution that doesn't involve doing the > comparisons twice. > > > > <Results> { > > for $A in doc("data.xml")/ASet/A > > let $matches := $A/(B[.=("red","yellow")] > > |C[.=("chair","table")]) > > where ($matches) > > return <A>{$matches}</A> > > }</Results> > > I like your solution because does not require the > expression of the > comparisons twice. But, it does not provide the > exact solution I was > looking for. > > This is what I get: > > <Results> > <A> > <B>red</B> > <B>yellow</B> > <C>chair</C> > <C>table</C> > </A> > <A> > <B>red</B> > <C>chair</C> > </A> > <A> > <C>chair</C> > <C>table</C> > </A> > </Results> > > first, the attribute name in A is missing. Then, the > third A element > does not match my predicate as I desire that only if > there is at least > one "B" element and one "C" element matching the > conditions, then the > "A" should be returned. > > The solution from Mukul provides the expected > result, but it seems that > you have to do first the filtering and then the > pruning in two different > steps. > > I'm interested in the pruning for the following use > case: a user wants > to extracts the set of A elements that hold a > certain set of > characteristics. For a certain characteristic, if > there are many choices > (e.g., B has siblings with different values), then > only the ones > matching the user request should be returned. > > If there is no more compact solution than the > Mukul's one, then I could > think about something like: > > <Results> > { > for $A in doc("data.xml")/ASet/A > where ($A/B = "red" or $A/B = "yellow") > and ($A/C = "chair" or $A/C = > "table") > return pruned {$A} > } > </Results> > > The "pruned" terminal adds the expected semantics to > the result. This > could be rewritten in a standard XQuery query before > to be run and the > problem moves to which is the best way to rewrite > it. > > > - Sergio > > > > > Michael Kay > > http://www.saxonica.com/ > > > > > >>Hi Sergio, > >> Probably this XQuery is required.. > >> > >><Results> > >>{ > >> for $A in doc("data.xml")/ASet/A > >> where ($A/B = "red" or $A/B = "yellow") > >> and ($A/C = "chair" or $A/C = "table") > > >> > >> return > >> <A> > >> {$A/@*} > >> {$A/B[(. = 'red') or (. = 'yellow')]} > >> {$A/C[(. = 'chair') or (. = 'table')]} > >> </A> > >>} > >></Results> > >> > >>Regards, > >>Mukul > >> > >>--- Sergio Andreozzi > <sergio.andreozzi@cnaf.infn.it> > >>wrote: > >> > >>>Dear all, > >>> > >>>I'm wondering what is the best way to prune > subtrees > >>>that did not match > >>>the where clause of a FLOWER expression. See the > >>>example below for > >>>clarification: > >>> > >>>SAMPLE DATA > >>> > >>><ASet> > >>> <A name="one"> > >>> <B>red</B> > >>> <B>yellow</B> > >>> <B>green</B> > >>> <C>chair</C> > >>> <C>table</C> > >>> <C>sofa</C> > >>> </A> > >>> <A name="two"> > >>> <B>red</B> > >>> <B>green</B> > >>> <C>chair</C> > >>> <C>sofa</C> > >>> </A> > >>> <A name="three"> > >>> <B>green</B> > >>> <C>chair</C> > >>> <C>table</C> > >>> <C>sofa</C> > >>> </A> > >>></ASet> > >>> > >>>QUERY: for each A, list all the name of A, their > B > >>>elements that are > >>>either "red" or "yellow" and their C elements > that > >>>are either "chair" or > >>>"table" > >>> > >>>EXPECTED RESULT: > >>> > >>><Results> > >>> <A name="one"> > >>> <B>red</B> > >>> <B>yellow</B> > >>> <C>chair</C> > >>> <C>table</C> > >>> </A> > >>> <A name="two"> > >>> <B>red</B> > >>> <C>chair</C> > >>> </A> > >>></Results> > >>> > >>> > >>>in practice what I would like to understand is > how > >>>to prune all the > >>>subtrees that do not contain any match with > >>>components of the WHERE > >>>clause in the XQuery result. > >>> > >>>The general pruning rule is "if an element does > not > >>>participate in the > >>>satisfaction of the WHERE clause and all its > >>>children elements (if any) > >>>don't participate as well, then prune it from the > >>>result". > >>> > >>>A possible starting point is the following query, > >>>but the pruning action > >>>is missing. > >>> > >>><Results> > >>>{ > >>> for $A in doc("data.xml")/ASet/A > >>> where ($A/B = "red" or $A/B = "yellow") > >>> and ($A/C = "chair" or $A/C = > "table") > >>> return ... > >>>} > >>></Results> > >>> > >>> > >>> > >>>Thanks, > >>> > >>> Sergio > >> > >> > >> > >> > >>__________________________________ > >>Do you Yahoo!? > >>Yahoo! Small Business - Try our new resources > site! > >>http://smallbusiness.yahoo.com/resources/ > >> > >> > > > > > > > > > > > -- > Sergio Andreozzi > INFN-CNAF, Tel: +39 051 609 > 2860 > Viale Berti Pichat, 6/2 Fax: +39 051 609 > 2746 > 40126 Bologna (Italy) Web: > http://www.cnaf.infn.it/~sergio > __________________________________ Do you Yahoo!? Yahoo! Small Business - Try our new resources site! http://smallbusiness.yahoo.com/resources/
Received on Monday, 21 March 2005 13:49:45 UTC