Как получить узел без детей в xQuery? - PullRequest
5 голосов
/ 12 июня 2010

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

Учитывая:

<stuff>
  <item foo="foo" boo="1"/>
  <item foo="bar" boo="2" />
  <item foo="baz" boo="3"/>
  <item foo="blah boo="4""/>
</stuff>

<list  a="1" b="2">
  <foo>bar</foo>
  <foo>baz</foo>
</list>

Я хочу просмотреть список и перекрестные ссылкиэлементы в "вещи" для этого результата:

<list  a="1" b="2">
  <item foo="bar" boo="2" />
  <item foo="baz" boo="3"/>  
</list>

Я хочу сделать это без необходимости знать, какие атрибуты могут быть в "списке".Другими словами, я не хочу явно вызывать их как

attribute a { $list/@a }, attribute b { $list/@b }

Ответы [ 2 ]

4 голосов
/ 12 июня 2010

Использование:

$list1/item[@foo = $list2/item/@foo]

Выбирает все <item> элементов в $list1 значение которых fooатрибут равен атрибуту foo одного из элементов <item> в $ list2.

Чтобы скопировать все атрибуты элемента <list>, сделайте что-то подобное :

  for $attr in /whateverIsthePathLeadingToList/list/@*
    return 
      attibute {name($attr)} {$attr}
3 голосов
/ 30 августа 2011

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

предположить:

let $ old_list: =

Thisсоздает новый список, копируя его атрибуты

 <list>{$old_list/@*}</list>
...