xquery- how to obtain min/max value from a set of values that are obtained by subtracting consecutive members from a list

StackOverflow https://stackoverflow.com/questions/12939591

Domanda

In an xquery expression, I have obtained a set of values within a for-expression, and one value is in a separate variable.

Now, I want to subtract the single value from first value of the list, and then subtract consecutive members of the list from each other-- and in the resulting set of difference values, I want to obtain the min/max values...

The query upto now looks like this--

let $value1:= 1998
let $rows_citations:= 
         $doc//div[@id="patent_citations"]
                     /div[@id="patent_citations_v"]
                          /table[@class="rel_patent"]
                             /tbody/tr[1]
                                      /following-sibling::tr
for $pos in $rows_citations/position()
let $date2_c := customfn:dateconverter1($rows_citations[$pos]/td[3])

Now the subtraction I want is between first value of date2_c and value 1, and after that between consecutive members of date2_c... And from the resulting list I want the min/max values... How do I go about doing this?

I am esp. confused about creating a new list variable that stores all the differences, esp. when we are already inside a for loop, and are iterating over each value of a list (via variable date2_c)

È stato utile?

Soluzione

I. This XQuery 3.0 query (which is also a pure XPath 3.0 expression):

let $pVal := 1,
    $vList := (2,4,7,11,16),
    $vList2 := ($pVal, subsequence($vList, 1, count($vList)-1)),
    $vSubtactedList :=
            map-pairs(function($m as xs:integer, $n as xs:integer) as xs:integer
                        {
                         $m - $n
                        },
                        $vList,
                        $vList2
                      )
    return
      (min($vSubtactedList), max($vSubtactedList))

produces the wanted result the minimum and maximum values from the list of subtractions:

1 5

II. XQuery 1.0 solution:

let $pVal := 1,
    $vList := (2,4,7,11,16),
    $vList2 := ($pVal, subsequence($vList, 1, count($vList)-1)),
    $vSubtactedList :=
                for $i in 1 to count($vList)
                 return
                    $vList[$i] - $vList2[$i]

 return
    (min($vSubtactedList), max($vSubtactedList))

This again produces the same correct result:

1 5
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top