[xquery-talk] Incorrect Intersect and Except Output?

Florent Georges lists at fgeorges.org
Sat Mar 29 15:36:23 PST 2008


"Wei, Alice J." wrote:

> let $a :=
>
collection("xmldb:exist://db/cbm")//ad//address[contains(upper-case(.),$search)],
> $c :=
>
collection("xmldb:exist://db/cbm")//ad//address[contains(upper-case(.),$search2)],

> [...]

> $a intersect $c

  If you want to apply two predicates to the same nodes, why don't do
it simply and explicitely:

    collection("xmldb:exist://db/cbm")//ad//address
      [contains(upper-case(.),$search)]
      [contains(upper-case(.),$search2)]

  Or even better to encapsulate the predicate and avoid duplicate
upper-casing of whole element's text value:

    declare function local:my-predicate(
        $elem as element(),
        $str1 as xs:string,
        $str2 as xs:string
      )
      as xs:boolean
    {
      let $v := upper-case($elem)
        return
          contains($v, $str1) and contains($v, $str2)
    }

    collection("xmldb:exist://db/cbm")//ad//address
      [local:my-predicate(., $search, $search2)]

or for variable number of search strings:

    declare function local:all-true($b as xs:boolean+)
      as xs:boolean
    {
      empty($b[not(.)][1])
    }

    declare function local:my-predicate(
        $elem as element(),
        $strs as xs:string+
      )
      as xs:boolean
    {
      let $v := upper-case($elem)
        return
          local:all-true(
            for $s in $strs return contains($v, $s))
    }

    collection("xmldb:exist://db/cbm")//ad//address
      [local:my-predicate(., ($search, $search2))]

  Not tested.

  Regards,

--drkm
























      _____________________________________________________________________________ 
Envoyez avec Yahoo! Mail. Plus de moyens pour rester en contact. http://mail.yahoo.fr



More information about the talk mailing list