Mon document XML contient un enregistrement du mouvement d'un objet. Le document XML consiste en une série d'observations. Chaque observation contient la position lat/long de l'objet, la position lat/long du capteur d'observation et un horodatage.
<Track-History>
<Track-ID>XYZ</Track-ID>
<Observation>
<Target-Latitude>10.3</Target-Latitude>
<Target-Longitude>20.8</Target-Longitude>
<Observer-Latitude>40.0</Observer-Latitude>
<Observer-Longitude>50.0</Observer-Longitude>
<DateTime>20230202T071700.00</DateTime>
</Observation>
<Observation>
<Target-Latitude>15.1</Target-Latitude>
<Target-Longitude>25.2</Target-Longitude>
<Observer-Latitude>40.0</Observer-Latitude>
<Observer-Longitude>50.0</Observer-Longitude>
<DateTime>20230202T071800.00</DateTime>
</Observation>
</Track-History>
Je veux brouiller les emplacements de l'objet en arrondissant les valeurs décimales de latitude et de longitude. J'ai donc créé cette fonction de mise à jour :
declare updating function f:fuzzPoint($lat as element(), $long as element())
{
replace node $lat with
element {name($lat)} {round(number(data($lat)))},
replace node $long with
element {name($long)} {round(number(data($long)))}
};
Lorsque j'invoque cette fonction :
{f:fuzzPoint($obs/Target-Latitude, $obs/Target-Longitude)}
J'obtiens ce message d'erreur :
If any subexpression is updating, then all must be updating
Oxygen XML affiche une ligne rouge sous les arguments de la fonction, ce qui signifie que les arguments doivent être mis à jour. Oui ? Si oui, comment faire pour que les arguments soient mis à jour ?
Vous trouverez ci-dessous mon programme complet de mise à jour XQuery.
declare namespace f = "function";
declare variable $Track-History := doc('Track-History.xml');
declare variable $track-history-points := (for $i in $Track-History//Observation return [$i/Target-Latitude, $i/Target-Longitude]);
declare variable $AOR := (); (: should be a sequence of points, fake it for now :)
declare function f:isInside($points, $polygon) as xs:boolean
{
true()
};
declare updating function f:fuzzPoint($lat as element(), $long as element())
{
replace node $lat with
element {name($lat)} {round(number(data($lat)))},
replace node $long with
element {name($long)} {round(number(data($long)))}
};
if (f:isInside($track-history-points, $AOR)) then
for $obs in $Track-History//Observation return
replace node $obs with
<Observation>
{f:fuzzPoint($obs/Target-Latitude, $obs/Target-Longitude)}
{$obs/Observer-Latitude}
{$obs/Observer-Longitude}
{$obs/DateTime}
</Observation>
else
replace node $Track-History/* with
<Track-History/>