2015-12-01 4 views
0

У меня есть следующие данные:XQuery - Как создать карту, используя следующие данные?

<courses> 
    <course subjectId="3" name="World War II"/> 
    <course subjectId="5" name="Algebra I"/> 
    <course subjectId="5" name="Statistics"/> 
    <course subjectId="15" name="Physics"/> 
    <course subjectId="5" name="Algebra II"/> 
    <course subjectId="15" name="Chemistry"/> 
</courses> 

Я хотел бы создать сценарий XPATH таким образом, что она производит следующую карту:

map { 
    '3': ('<course subjectId="3" name="World War II"/>'), 
    '5': ('<course subjectId="5" name="Algebra I"/>', '<course subjectId="5" name="Algebra II"/>', '<course subjectId="5" name="Statistics"/>'), 
    '15': ('<course subjectId="15" name="Physics"/>', '<course subjectId="15" name="Chemistry"/>') 
} 

Как я могу это сделать?

ответ

2

Для использования карт вам нужны либо XPath 3.1, XQuery 3.1, либо XSLT 3.0.

Чистый XPath 3.1 решение будет

map:merge(
    for $x in distinct-values(course/@subjectId) 
    return map{$x : 
      course[@subjectId = $x] ! 
       serialize(., map{'method':'xml', 'omit-xml-declaration':true()}) 
      }) 

Но я не знаю, почему вы хотели бы создать карту, содержащую узлы сериализовать в виде строки XML. Помещение самого узла в значение карты было бы намного полезнее.

=== REVISED ОТВЕТ ===

В комментариях вы изменили свои требования, так что

  • Вы хотите, XQuery решение, а не XPath
  • Вы хотите карту в содержат соответствующие узлы, а не сериализацию XML узлов.

Это означает, что вы можете сделать:

map:merge(
    for $x in course 
    group by $id := $x/@subjectId 
    return map{$id : $x}) 

(Не проверено: пожалуйста, дайте нам знать, работает ли это Обратите внимание, что он нуждается в XQuery 3.1)

+0

На самом деле я хочу, чтобы поместить узел его self (не сериализуется в строке). Кроме того, указанный выше запрос кажется немного неэффективным. Например, если бы у меня были курсы «n'0», ему нужно было бы перебирать максимум n^2 раза, если я правильно ее понимаю. Я хотел просто повторить его один раз. –

+2

Ну, эффективность полностью зависит от оптимизатора. Да, вы с большей вероятностью получите достойную эффективность, если используете XQuery 3.0 «group by» или XSLT для каждой группы. Но вы сказали, что хотите получить чистое решение XPath. –

+0

Извинения, я снова написал это неправильно. Мне нужно решение XQuery. –