Pentaho - XPath Выбрать всех детей с определенным родителем - PullRequest
0 голосов
/ 30 апреля 2018

Я использую Pentaho «Получить данные из XML».

Я хочу выбрать всех детей <price>, чей родитель <book> имя '1.1'.

<bookstore>
  <book name = '1.1'>
    <title lang="en">Learning XML</title>
    <price>29.99</price>
    <price>39.99</price>
    <price>59.99</price>
  </book>

  <book name = '1.2'>
    <title lang="en">Harry Potter</title>
    <price>39.95</price>
  </book>
</bookstore>

Конфигурация, которую я поставил с этим шагом:

Configuration Step Content

Configuration Step Fields

И результат, который я получил, следующий:

Result

Если я изменю 'Loop Xpath' в Контенте, например: /bookstore/book/price Я получу 4 строки с одинаковой первой ценой (29,99).

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

В «Content» вы устанавливаете «loop XPath» на /bookstore/book, так что в итоге вы получите цикл над (в этом примере) двумя элементами - одним, который вы хотите, и другим.

В «Полях» вы обычно настраиваете поля данных, которые будут извлекаться из каждого из этих элементов. Поэтому XPath здесь должен быть относительным.

Но вы использовали //book[@name = '1.1']/price, что является абсолютным путем. Он выбирает три элемента, из которых Pentaho может взять только первый, чтобы заполнить поле. Вот почему вы получаете 29.99 два раза.

Что делать? Это всегда один и тот же подход.

Чтобы получить общую информацию по всем книгам:

  • Выберите нужные элементы в части «петля»: //book
  • Выберите значения поля, используя относительные пути: ./price[1] и, возможно, ./title

Чтобы получить общую информацию об одной конкретной книге:

  • Выберите нужный элемент в части «петля»: //book[@name = '1.1']
  • Выберите значения поля, используя относительные пути: ./price[1] и, вероятно, ./title

Чтобы узнать цены одной конкретной книги:

  • Выберите нужные элементы в части «петля»: //book[@name = '1.1']/price
  • Выберите значения поля, используя относительные пути: ./text() (или просто .)
0 голосов
/ 30 апреля 2018

Спасибо, Томалак! Это работает. Я пытался поставить /bookstore/book[@name='1.1']/* Wasmachien, но в Пентахо не работает, но спасибо за ответ!

Ключ был: "В" Полях "вы обычно настраиваете поля данных, которые должны извлекаться из каждого из этих элементов. Поэтому XPath должен быть здесь относительным."

Теперь я попытался выбрать все указанные дочерние узлы с помощью //book[@name = '1.1'], но если в родительской книге есть, например, 'price' и 'discount' . Попытка с . или price в относительных путях не работает, она возвращает только первый дочерний элемент снова. Можно использовать //book[@name = '1.1'] и получить всех детей с соответствующими узлами?

Спасибо

0 голосов
/ 30 апреля 2018

Попробуйте /bookstore/book[@name='1.1']/*

...