2016-04-27 10 views
0

Ich habe viele XQuery-Position gelesen, aber alle Beispiele sind über >, < oder =. Aber Sie können auch x - y verwenden und ich bin verwirrt darüber, was inklusive ist und was nicht.XQuery-Position verstehen(): inklusive oder exklusive Endposition

[position() = $startPosition to $endPosition] 

Sagen wir start $ 1 ist (wie ich diese Position nicht startet mit 0, aber mit 1 gelesen haben), was den ersten Treffer zurückkehren? $ endPosition auch auf 1 oder 2?

Mit anderen Worten, bei einer erwarteten Rendite von n, was wäre die Formel für beide Variablen? Um die Dinge klarer zu machen, können wir eine inkrementierende Schleife hinzufügen ($iteration). Grundsätzlich erzeugen wir eine Suche, die alle nachfolgenden Treffer mit Position findet. (Als ein Beispiel.)

$endPosition = 1 + ($iteration * n); 
$startPosition = $endPosition - n; 

Das ist, was ich gefunden habe. Dies wird in folgendem Ergebnis führen, für $iteration von 1 und Inkrementieren beginnt und n von 3.

1: 
$endPosition = 1 + (1 * 3); // 4 
$startPosition = 4 - 3;  // 1 
2: 
$endPosition = 1 + (2 * 3); // 7 
$startPosition = 7 - 3;  // 4 
3: 
$endPosition = 1 + (3 * 3); // 10 
$startPosition = 10 - 3;  // 7 

Aber ist das richtig? Ich bin nicht sicher. Ist die $endPosition enthalten? Wenn nicht, ist mein Code korrekt, wenn nicht - ist es nicht, und dann interessiert mich die richtige Formel.

+1

ich nicht bekommen, was Sie nach an alle. Du sprichst von Unterfolgen, dann machst du einige Berechnungen, die nicht wirklich verwandt erscheinen. Könnten Sie ein Beispiel hinzufügen, das Ihre Absicht erklärt? –

Antwort

0

Der Ausdruck $sequence[position() = $a to $b] an folgenden FLWOR Ausdruck entspricht (wo $position Start bei 1):

for $x at $position in $seq 
where $position >= $a and $position <= $b 
return $x 

So die ersten beiden Elemente überspringen und dann die folgenden fünf zurückkehrt, müssen Sie $seq[position() = 3 to 7].

Hier ist, wie Sie von diesem zu einer Subsequenz Funktion gehen kann, dass ein 0 verwendet -basierte Offset und die Anzahl der Elemente zurück:

declare function local:subsequence(
    $seq as item()*, 
    $offset as xs:integer, 
    $length as xs:integer 
) as item()* { 
    let $start := $offset + 1, 
     $end := $offset + $length 
    return $seq[position() = $start to $end] 
}; 

local:subsequence(1 to 100, 0, 5), (: returns (1, 2, 3, 4, 5) :) 
local:subsequence(1 to 100, 13, 3) (: returns (14, 15, 16) :) 
+0

Also, bei diesem Beispiel sind sowohl $ a (Start) als auch $ b (Ende) * inklusive *, oder? 1-2 geht durch eins und zwei, danach ist es 3-4, dann 5-6 und so weiter - anstatt 1-2, 2-3, 3-4 - wenn Sie möchten, dass jeder Code eine andere Position ohne zurückgibt Überlappung. –

+0

Korrigieren. Der Operator '=' in XQuery hat eine * existentielle Semantik *, wenn seine Eingaben Nicht-Singleton-Sequenzen sind; '$ value1 = $ value2' ist äquivalent zu' einigen $ a in $ value1, $ b in $ value2 erfüllt $ a eq $ b', wobei 'eq' die Gleichheit für einzelne' item() 's ist.Dies bedeutet auch, dass $ seq [position() = $ a zu $ ​​b] 'äquivalent zu' für $ pos in $ a zu $ ​​b return $ seq [$ pos] 'ist. –

0

Es ist unklar, das spezifische Problem, das Sie zu lösen sind versucht, so dass ich weiß nicht, ob dies Ihre Frage beantwortet, aber wir diesen Ausdruck entpacken zuerst:

[position() = $startPosition to $endPosition] 

Say $startPosition 1 ist und $endPosition 3 . das wird bewerten zu:

[position() = (1, 2, 3)] 

das Prädikat wird return true jederzeit position() gleich einem der Werte in der Reihenfolge auf der rechten Seite.