XPATH Postgres. Получить узлы с его атрибутом children - PullRequest
1 голос
/ 20 марта 2020

Мне нужна ваша помощь, чтобы решить эту проблему. У меня есть xml, и мне нужно получить 2 атрибута, первый атрибут может иметь много дочерних атрибутов. Мне нужно получить всех детей, но с его родительским атрибутом.

У XML есть много родительских уровней, но я показываю только то, что мне интересно.

  <group name="Name 1">
    <subgroup target="30" show="true">
      <subgroup step="0" key="342d8743cd43db67240ad88be462b5ee"/>
      <subgroup step="2" key="342d8743cd43db67240ad88be462b5ee"/>
      <subgroup step="5" key="342d8743cd43db67240ad88be462b5ee"/>
    </subgroup>
    <subgroup target="45" show="true">
      <subgroup step="0" key="d0a7c4e08dde0d5ea3558d17bbed1413"/>
    </subgroup>
    <subgroup target="23" show="true">
      <subgroup step="2" key="46c787738274a4bd3968dfbec5b12c7c"/>
    </subgroup>
    <subgroup target="80" show="true">
      <subgroup step="1" key="bf6972c426b1672e7108c1680626698b"/>
    </subgroup>
  </group>

Я пытаюсь с этим SQL:

SELECT unnest ((xpath ('//// подгруппа / @ target', o c .xml_row)) :: text) AS target, unnest ((xpath ('/ ///subgroup/subgroup/@step',oc.xml_row))::text) AS step FROM publi c .target_conf AS oc;

С этим SQL i получить декартово произведение цели и шага, но если я поставлю только 1 строку, я получу все цели или все шаги в порядке.

Мне нужно получить 'цель' с его детьми 'шага'.

Пример что я хочу вернуть с sql posgres:

TARGET | ШАГ

30 | 0

30 | 2

30 | 5

45 | 0

23 | 2

80 | 1

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 21 марта 2020
SELECT
    xpath('@target', subgroup) AS target,
    unnest(xpath('subgroup/@step', subgroup)::text[]) AS step
FROM (
    SELECT
        unnest(xpath('/group/subgroup', oc.xml_row)) AS subgroup
    FROM
        public.target_conf AS oc
) AS subgroups;

дает

target  step
    30     0
    30     2
    30     5
    45     0
    23     2
    80     1

См. SQL скрипка: http://sqlfiddle.com/#! 15 / 38a43 / 9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...