E' molto probabile che si gestiscano messaggi che contengono campi che si ripetono, con un numero sconosciuto di ripetizioni. Questa è la situazione che si verifica con il campo Item nel messaggio di esempio descritto nella sezione Messaggio di esempio.
Per scrivere un filtro che tenga conto di tutte le istanze del campo Item, è necessario utilizzare una struttura che possa ripetersi per tutte le istanze di un campo ripetuto. Il predicato quantificato consente di eseguire un predicato su tutte le istanze di un campo ripetuti e raccogliere i risultati.
Ad esempio, si potrebbe voler verificare che nessuno degli articoli ordinati raggiunga una quantità superiore a 50. A tale scopo si potrebbe scrivere:
FOR ALL Body.Invoice.Purchases."Item"[] AS I (I.Quantity <= 50)
Con il predicato quantificato, la prima cosa da notare sono le parentesi quadre [] alla fine del riferimento di campo dopo FOR ALL. Queste indicano che si sta reiterando su tutte le istanze del campo Item.
In alcuni casi, questa sintassi non è necessaria poiché si possono ottenere quelle informazioni dal contesto, ma la si mantiene per coerenza con altre parti di sintassi.
La clausola AS associa il nome I all'istanza corrente del campo che si ripete. E' simile al concetto di classi di iterazione utilizzato in alcuni linguaggi orientati agli oggetti come C++. L'espressione tra parentesi è un predicato valutato per ogni istanza del campo Item.
Una descrizione di questo esempio è:
Quella precedente è una descrizione di come viene valutato il predicato se si utilizza la parola chiave ALL. Un'alternativa è specificare SOME o ANY, che sono equivalenti. In questo caso il predicato quantificato restituisce TRUE se il predicato secondario restituisce TRUE per qualsiasi istanza del campo ripetuto. Solo se il predicato secondario restituisce FALSE per tutte le istanze del campo ripetuto, il predicato quantificato restituisce FALSE. Il predicato secondario restituisce una combinazione di valori FALSE e UNKNOWN, viene restituito un valore globale UNKNOWN.
Nella seguente espressione di filtro:
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Title = 'The XML Companion')
il predicato secondario ha valore TRUE. Tuttavia questa successiva espressione restituisce FALSE:
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Title = 'C Primer')
poiché C Primer non è incluso in questa fattura. Se alcuni articoli nella fattura non includono un campo relativo al titolo libro, il predicato secondario restituisce UNKNOWN e il predicato quantificato restituisce il valore UNKNOWN.
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')
Il predicato IS NOT NULL garantisce che, se un campo Item non contiene una voce Book, il predicato secondario restituisce un valore FALSE.
E' anche possibile manipolare le ripetizioni arbitrarie dei campi in un messaggio utilizzando l'espressione SELECT, come descritto in Riferimento alle colonne in un database.
È possibile fare riferimento alla prima e all'ultima istanza di un campo che si ripete utilizzando gli indici di array [>] e [<] e alle istanze connesse alla prima e all'ultima, anche se non è noto il numero di istanze presenti. Tali indici sono descritti in Accesso a più ricorrenze conosciute di un elemento.
In alternativa, è possibile utilizzare la funzione CARDINALITY per stabilire quante siano le istanze di un campo ripetuto. Ad esempio:
DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])