XQuery - Как я могу рассчитывать и сохранять информацию на карте - PullRequest
0 голосов
/ 23 марта 2020

Я хочу сохранить идентификаторы на карте. Если идентификатор повторяется, я хочу установить количество ($ value) от 1 до 2 и так далее. После вы найдете мой код:

declare namespace functx = "http://www.functx.com";
declare variable $idMap := map{};

declare function functx:uniqueID ($entityID as xs:string) as xs:integer {
let $idMap := map:merge(($idMap, if(not(map:contains($idMap, $entityID))) then map:entry($entityID, 1) else map:entry(entityID, map:get($idMap, $entityID)+1)))
return map:get($idMap, $entityID)
};

declare variable $map := map:merge((
 map:entry("Sheff", "85246525"),
 map:entry("Peter", "85246454"),
 map:entry("Marcel", "85246525"),
 map:entry("Lion", "85244565"),
 map:entry("Klaus", "85241234")
));


map:for-each($map,
  function($key, $value) {
    functx:uniqueID($value)
  } 
)

Результат:

1
1
1
1
1

Ожидаемый результат

1
1
2      (: Because it is the second time, that 85246525 occurs. :)
1
1

Отредактировано 23.03.2020 - 17:45: у меня сложный xquery, который работает. Но целевой системе нужны уникальные идентификаторы на строку. У меня есть карта, которая содержит мою информацию, как верхнюю. Мне нужно добавить что-то позади идентификаторов, например (001, 002, 003), чтобы иметь разные идентификаторы.

Рекомендуется, чтобы только дублированные идентификаторы получали добавленное число.

Понимаете ли вы? или что тебе еще нужно от меня?

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Один из способов создания новой карты с добавлением «индекса» к дублированным значениям состоит в использовании группировки:

map:merge(
    for $key in map:keys($map)
    group by $value := $map($key)
    for $group-key at $pos in $key
    return map:entry($group-key, $value || '-' || format-integer($pos, '000'))
)

При https://xqueryfiddle.liberty-development.net/6qVSgeT, что дает

{
    "Peter": "85246454-001",
    "Marcel": "85246525-001",
    "Sheff": "85246525-002",
    "Lion": "85244565-001",
    "Klaus": "85241234-001"
  }
0 голосов
/ 23 марта 2020

Вы написали свой код, как будто $idMap является изменяемым, и как будто у вызова functx:uniqueID() есть побочный эффект изменения карты. Это не сработает на функциональном языке.

Вам нужен совершенно другой подход; и чтобы помочь вам в этом, нам нужно взглянуть на проблему, которую вы пытаетесь решить, а не на ваш существующий подход к решению.

...