Yes, it makes sense.  It is handy to use cts:query constructors to
easily generate queries from user input. 

If it was possible to change your XML, then you could make the attribute
content reside in an element.  For example, you could transform your
structure that looks like this: 

<carList>
       <car color="green">M3</car>
       <car color="blue">beetle</car>
       <car color="yellow">fiat</car>
       <car color="red">911</car>
</carList>

to one that looks like this:

<carList>
       <car>
         <color>green</color>
         <model>M3</model>
       </car>
       <car>
         <color>blue</color>
         <model>beetle</model>
       </car>
       <car>
         <color>yellow</color>
         <model>fiat</model>
       </car>
       <car>
         <color>red</color>
         <model>911</model>
       </car>
</carList>

With this structure, your original approach of using the element query
would work.

Good luck.

-Danny

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Jacob
Meushaw
Sent: Wednesday, December 12, 2007 11:35 AM
To: General Mark Logic Developer Discussion
Subject: Re: [MarkLogic Dev General] simple cts:search question

Danny,

My app basically allows a user to input multiple optional query
parameters. I then create a cts:query with those parameters which gets
passed to a cts:search to identify matching documents. The documents
are then typically summarized and returned. I'll also wind up reusing
the cts:query that I created to do odd things to try to improve my
performance(heavy use of cts:element-values and cts:uris). I've found
that using the cts:query results in cleaner code.

I don't think the other techniques you described will work for me
because I need to use my query to search over the entire document or
for lexicon queries.

I hope this makes sense,
Jake

On Dec 12, 2007 12:55 PM, Danny Sokolsky <[EMAIL PROTECTED]>
wrote:
> 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
>
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to