Hi Jake, You are correct, you cannot express that with only a cts:query; you also need to use the first arg to cts:search. The cts:query constructors allow you to do many things, even most things, but not all things. As I said, you can still perform this search a number of ways, two of which are below.
Is there some reason the other ways won't work for you? -Danny -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Jacob Meushaw Sent: Wednesday, December 12, 2007 7:26 AM To: General Mark Logic Developer Discussion Subject: Re: [MarkLogic Dev General] simple cts:search question Danny, Thanks for the response. This is a serious bummer for me. I guess I was incorrectly under the impression that I could successfully recreate any xPath using cts:query constructors. What I'm hearing is that I CAN NOT write a cts:query that says: Find a document that: has an element "docname" with a value of "cars" and has an element "car" with a value of "m3" and an attribute "color" = "green" Is this correct? Thanks, Jake On Dec 10, 2007 12:57 PM, Danny Sokolsky <[EMAIL PROTECTED]> wrote: > Hi Jacob, > > Your query will not work with an element-query constructor. The > element-query constructor searches through all text-node descendants of > the specified element; it does not search through attribute nodes. > > Using the first parameter to cts:search, you can test for both the > attribute and the element value you want. > > The two methods I suggested earlier should work, I think. For example: > > cts:search(/mydoc/data/carList/car, > cts:and-query(( > cts:element-value-query(xs:QName("car"), "m3"), > cts:element-attribute-value-query(xs:QName("car"),xs:QName("color"), > "blue") > )) > ) > > This does not return the node (because it is searching under the car > element). > > This was does return the node: > > cts:search(/mydoc/data/carList/car, > cts:and-query(( > cts:element-value-query(xs:QName("car"), "m3"), > cts:element-attribute-value-query(xs:QName("car"),xs:QName("color"), > "green") > )) > ) > > If you want to get the whole document, you can then use XPath or a > function to get there, as follows: > > cts:search(/mydoc/data/carList/car, > cts:and-query(( > cts:element-value-query(xs:QName("car"), "m3"), > cts:element-attribute-value-query(xs:QName("car"),xs:QName("color"), > "green") > )) > )/fn:root() > > Does this get you what you need? > > -Danny > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Jacob > Meushaw > Sent: Monday, December 10, 2007 8:06 AM > To: General Mark Logic Developer Discussion > Subject: Re: [MarkLogic Dev General] simple cts:search question > > > I think my example wasn't sufficient to explain the problem fully. > Below is some code that does a better job of showing what I'm doing > and what my problem is. > > (: create a test document :) > > let $testDoc := > > <mydoc> > <properties> > <docname>cars</docname> > </properties> > <data> > <carList> > <car color="green">M3</car> > <car color="blue">beetle</car> > <car color="yellow">fiat</car> > <car color="red">911</car> > </carList> > </data> > </mydoc> > > return xdmp:document-insert("mytest.xml",$testDoc,(),("test")) > > > (: cts search for docs with a docname of "cars" and containing a blue > M3 in it's car list :) > (: This query returns the document because there is a car with a color > of blue and a car with a name of M3. :) > (: This is not the behavior I'm looking for. I want it to fail because > the M3 is not blue. :) > > let $query := cts:and-query(( > > cts:element-query(xs:QName("properties"),cts:element-value-query(xs:QNam > e("docname"),"cars")), > cts:element-query(xs:QName("carList"), > cts:and-query(( > > > cts:element-attribute-value-query(xs:QName("car"),QName("","color"),"blu > e"), > cts:element-value-query(xs:QName("car"),"M3") > )) > ) > )) > > return cts:search(collection("test")/mydoc,$query) > > > > On Dec 6, 2007 1:01 PM, Danny Sokolsky <[EMAIL PROTECTED]> wrote: > > Thanks Mike, you are absolutely correct. Sorry 'bout that... > > > > So here are a few ways you might do this: > > > > 1) with XPath and cts:contains > > > > //car[cts:contains(., cts:and-query(( > > cts:element-value-query(xs:QName("car"), "m3"), > > cts:element-attribute-value-query(xs:QName("car"), > > xs:QName("color"), > > "green"))))] > > > > 2) with cts:search > > > > cts:search(/carList/car, > > cts:and-query(( > > cts:element-value-query(xs:QName("car"), "m3"), > > > cts:element-attribute-value-query(xs:QName("car"),xs:QName("color"), > > "green") > > )) > > ) > > > > Does that get you what you are looking for? > > > > -Danny > > > > -----Original Message----- > > From: [EMAIL PROTECTED] > > > > [mailto:[EMAIL PROTECTED] On Behalf Of Mike > > Sokolov > > Sent: Thursday, December 06, 2007 9:42 AM > > To: General Mark Logic Developer Discussion > > Subject: Re: [MarkLogic Dev General] simple cts:search question > > > > There might be something about the scope of the query (first arg to > > cts:search), but in my experience cts:element-query doesn't include > > itself in its scope, only its descendants, so I don't think the change > > you are suggesting will solve his problem? I put in a change request > to > > > > correct that: it seems like the behavior everyone expects. > > > > -Mike > > > > Danny Sokolsky wrote: > > > I think the problem is that the cts:element-query is on the > "carList" > > > element, and it should be on the "car" element. > > > > > > -Danny > > > > > > -----Original Message----- > > > From: [EMAIL PROTECTED] > > > [mailto:[EMAIL PROTECTED] On Behalf Of Jacob > > > Meushaw > > > Sent: Thursday, December 06, 2007 8:58 AM > > > To: [email protected] > > > Subject: [MarkLogic Dev General] simple cts:search question > > > > > > Hello All, > > > > > > I'm stumped on what must be a very simple cts:search question. > > > > > > I'm trying to identify documents in my database using cts:search > which > > > match a set of parameters. The case I'm stumped on is where I want > to > > > match on both the value of the element as well as one of it's > > > attributes. > > > > > > For example a document might contain: > > > > > > <carList> > > > <car color="green">M3</car> > > > <car color="blue">beetle</car> > > > <car color="yellow">fiat</car> > > > <car color="red">911</car> > > > </carList> > > > > > > I can't seem to figure out how to construct a cts query that matches > > > both the attribute value and the element value of the same element: > > > > > > cts:element-query( > > > xs:QName("carList"), > > > cts:and-query(( > > > > > > > > > cts:element-attribute-value-query(xs:QName("car"),QName("","color"),"blu > > > e"), > > > cts:element-value-query(xs:QName("car"),"M3") > > > )) > > > ) > > > > > > This incorrectly matches the example. The M3 is not blue. > > > > > > Hopefully this makes sense. > > > > > > Any ideas? > > > > > > Thanks, > > > Jake > > > _______________________________________________ > > > General mailing list > > > [email protected] > > > http://xqzone.com/mailman/listinfo/general > > > _______________________________________________ > > > General mailing list > > > [email protected] > > > http://xqzone.com/mailman/listinfo/general > > > > > _______________________________________________ > > General mailing list > > [email protected] > > http://xqzone.com/mailman/listinfo/general > > _______________________________________________ > > General mailing list > > [email protected] > > http://xqzone.com/mailman/listinfo/general > > > _______________________________________________ > General mailing list > [email protected] > http://xqzone.com/mailman/listinfo/general > _______________________________________________ > General mailing list > [email protected] > http://xqzone.com/mailman/listinfo/general > _______________________________________________ General mailing list [email protected] http://xqzone.com/mailman/listinfo/general _______________________________________________ General mailing list [email protected] http://xqzone.com/mailman/listinfo/general
