XMLTable не получает данные от детей в XML - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть этот кусок данных XML, на котором мне нужно использовать XMLTable, чтобы получить bulletinWorkl:id и bulletinWork/outOfServices/outOfService/document:destinationName из.

<?xml version="1.0" encoding="ISO-8859-1"?>
<cern:bulletinWork id="5307cedc-2208-3701-9b9d-e69664b1ef31">
  <cern:outOfServices>
    <cern:outOfService id="e95d491b-2876-3e08-901f-b0f79be86bfb">
      <cern:document destinationName="MonsA" type="S427"></cern:document>
    </cern:outOfService>
    <cern:outOfService id="fab04992-a33f-3a8c-ad16-29cd54fb93d6">
      <cern:document destinationName="MonsB" type="S427"></cern:document>
    </cern:outOfService>
  </cern:outOfServices>
</cern:bulletinWork>

Я пытаюсь выполнить этот запрос, и я успешно возвращаю атрибут ID в bulletinWork, но destinationName из bulletinWork/outOfServices/outOfService/document пусто.

select X.Id, X.DestinationName from S1589_XML_Bulletin, XMLTABLE(
    '$d/*:bulletinWork'
    PASSING XMLTYPE(XML_RAW) as "d"
    COLUMNS
        Id                  VARCHAR2(50) PATH   '@*:id',
        DestinationName     VARCHAR2(50) PATH   '*:outOfServices/*:outOfService/*:document/*:destinationName'
) AS X

Кто-нибудь видит, что я здесь делаю не так? Мне нужно получить:

Id                                       DestinationName
-------------------------------------    ------------------
5307cedc-2208-3701-9b9d-e69664b1ef31     MonsA
5307cedc-2208-3701-9b9d-e69664b1ef31     MonsB

1 Ответ

0 голосов
/ 27 апреля 2018
 COLUMNS
        Id                  VARCHAR2(50) PATH   '@id',
        DestinationName     VARCHAR2(50) PATH   'string-join(distinct-values(*:outOfServices/*:outOfService/*:document/@destinationName),", ")'

Вам не нужно использовать пространство имен для нефиксированных атрибутов. Их пространства имен определены как родительский элемент.

В примере xml есть несколько cern:outOfService, поэтому я использую string-join и distinct-values

Обновление:

1) Это длиннее, но более понятно для меня. Объединение двух таблиц xml.

    select * from xmltable('*:bulletinWork' passing xmltype('<cern:bulletinWork id="5307cedc-2208-3701-9b9d-e69664b1ef31" xmlns:cern="aaa">
      <cern:outOfServices>
        <cern:outOfService id="e95d491b-2876-3e08-901f-b0f79be86bfb">
          <cern:document destinationName="MonsA" type="S427"></cern:document>
        </cern:outOfService>
        <cern:outOfService id="fab04992-a33f-3a8c-ad16-29cd54fb93d6">
          <cern:document destinationName="MonsB" type="S427"></cern:document>
        </cern:outOfService>
      </cern:outOfServices>
    </cern:bulletinWork>')
    COLUMNS
            Id                  VARCHAR2(50) PATH   '@id',
            outOfServices       xmltype   path '*:outOfServices'  
    ) t1 
    ,xmltable('*:outOfServices/*:outOfService' passing t1.outOfServices 
    COLUMNS DestinationName     VARCHAR2(50) PATH   '*:document/@destinationName')

2) Доступ к родительскому узлу из дочернего узла.

select * from xmltable('*:bulletinWork/*:outOfServices/*:outOfService' passing xmltype('<cern:bulletinWork id="5307cedc-2208-3701-9b9d-e69664b1ef31" xmlns:cern="aaa">
  <cern:outOfServices>
    <cern:outOfService id="e95d491b-2876-3e08-901f-b0f79be86bfb">
      <cern:document destinationName="MonsA" type="S427"></cern:document>
    </cern:outOfService>
    <cern:outOfService id="fab04992-a33f-3a8c-ad16-29cd54fb93d6">
      <cern:document destinationName="MonsB" type="S427"></cern:document>
    </cern:outOfService>
  </cern:outOfServices>
</cern:bulletinWork>')
COLUMNS
        Id                  VARCHAR2(50) PATH   './../../@id', 
        DestinationName     VARCHAR2(50) PATH   '*:document/@destinationName'
)
...