XQuery - Проблема с объединением карты - Выполнение xbase - PullRequest
0 голосов
/ 20 марта 2020

Я очень новичок в xquery, и у меня есть проблема, которую я не могу решить.

Я хочу повторить xml и сохранить некоторые записи на карте. Так что я могу объединить одни и те же ключи с разными значениями (StringValue1, StringValue2). В конце я хочу вернуть полную карту и сохранить ее в файл. После вы найдете мой код. И я использовал xbase для выполнения этих xquerys.

CODE

declare namespace functx = "http://www.functx.com";

(: Function should merge the values, if the map contains the key, else it should put the new entrie to the map.:)
declare function functx:pnMap($map as map(*), $key as xs:anyAtomicType, $value as item()*) as map(*) {
    if(map:contains($map, $key)) then (map:merge(($map, map{$key:$value}), map{"duplicates":"combine"})) else map:merge((map{ $key: $value }, $map))
 } ;
 
let $pnMap := map{}

for $x in doc('file:///D:/Software/BaseX932/basex/input/MyXML.xml')/PFA/Records/Entity
return functx:pnMap($pnMap, substring-before((substring-after(data($x/BigUnsortedStringField), 'Owner: ')), '
'), string-join(('Position=Owner | ', 'EntityID=', data($x/@id),' | ', 'SomeOtherNo=', data($x/IDNumberTypes/ID[@IDType="StringWhereIfindsomeOtherNumber"])), ''))

РЕЗУЛЬТАТ

map {
  "Nick": "Position=Owner | EntityID=625115 | SomeOtherNo=7206512"
}
map {
  "James": "Position=Owner | EntityID=1016624 | SomeOtherNo=9138056"
}
map {
  "Nick": "Position=Owner | EntityID=1016625 | SomeOtherNo=9051648"
}
map {
  "Pete": "Position=Owner | EntityID=1016626 | SomeOtherNo=9051636"
}
map {
  "Jon": "Position=Owner | EntityID=1016675 | SomeOtherNo=9349667"
}

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

map {
  "Nick": "Position=Owner | EntityID=625115 | SomeOtherNo=7206512, Position=Owner | EntityID=1016625 | SomeOtherNo=9051648"
  "James": "Position=Owner | EntityID=1016624 | SomeOtherNo=9138056"
  "Pete": "Position=Owner | EntityID=1016626 | SomeOtherNo=9051636"
  "Jon": "Position=Owner | EntityID=1016675 | SomeOtherNo=9349667"
}

This является сокращенным отрывком из XML:

<Entity id="1016626">
  <Status>Active</Status>
  <IDNumberTypes>
    <ID IDType="SomeOtherNo">
      <IDValue>9051636</IDValue>
    </ID>
  </IDNumberTypes>
  <BigUnsortedStringField>Some text
    Owner: Pete
    Sister: Magrit
    Next Line text
    more text
  </BigUnsortedStringField>
</Entity>
<Entity>
....
</Entity>

1 Ответ

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

Я думаю, что вы хотите

map:merge(
  doc('file:///D:/Software/BaseX932/basex/input/MyXML.xml')/PFA/Records/Entity ! 
    map:entry(
      substring-before(substring-after(BigUnsortedStringField, 'Owner: '), '&#10;'),
      string-join(('Position=Owner', 'EntityID=' || @id, 'SomeOtherNo=' || IDNumberTypes/ID[@IDType="StringWhereIfindsomeOtherNumber"]), ' | ')
    ),
  map { 'duplicates' : 'combine' }
)

, но трудно написать код, не увидев ввод XML.

В качестве альтернативы вы также можете попробовать сначала использовать группу XQuery. на данных, которые вы хотите, а затем создать карту результата группировки:

map:merge(
  for $entity in doc('file:///D:/Software/BaseX932/basex/input/MyXML.xml')/PFA/Records/Entity
  group by $owner := substring-before(substring-after($entity/BigUnsortedStringField, 'Owner: '), '&#10;')
  return
    map:entry($owner, string-join(
$entity!string-join(('Position=Owner', 'EntityID=' || @id, 'SomeOtherNo=' || IDNumberTypes/ID[@IDType="StringWhereIfindsomeOtherNumber"]), ' | '), ' , '))
)
...