Это может быть сложно, хотя я не эксперт, когда дело доходит до XPath. Много дней ломал голову. Я пытаюсь извлечь определенные элементы из файла XML, чтобы создать таблицу, из которой я тогда нужно извлечь отдельные значения с помощью EXTRACTVALUE:Запрос XPath для извлечения информации из XML
SELECT [extractValue statements] FROM TABLE(XMLSequence(extract(lv_xml, lv_xpath))) t;
Каждая строка в таблице (один столбец) должен содержать один фрагмент XML, где требуемый элемент встречается не более одного раза. Его родительские узлы также должны быть извлечены в таблицу. Дело в том, что в источнике XML требуемый элемент может иметь родных братьев, которые также соответствуют моим требованиям. Мне нужно, чтобы братья и сестры оказались в отдельной строке в моей таблице результатов.
XML-похож на это (только с намного большим количеством контента, а также с различными идентификаторами):
<element id="Address">
<assignment name="name1" category="cat1" />
<field id="field1">
</field>
<field id="field2">
</field>
<field id="field3">
<assignment name="name5" category="cat2" />
<assignment name="name12" category="cat2" />
</field>
</element>
<element id="PersonInfo">
<field id="field1">
</field>
<field id="field2">
<assignment name="name17" category="cat1" />
</field>
<field id="field3">
</field>
<field id="field4">
</field>
</element>
etc etc
Я хочу элементов «задание», плюс их предков. Но, как я уже сказал выше, моя таблица «Осталось» не должна содержать более одного элемента «присваивания» в строке. То, что я пробовал до сих пор, кажется, извлекает лот, если двое из них являются братьями и сестрами. В дополнение к этому «присваивание» может быть дочерним элементом «элемента» или дочернего элемента «поля», что, вероятно, добавляет сложности.
Чтобы сделать 100% ясно, мой результат должен выглядеть следующим образом (в порядке для последующего EXTRACTVALUE работать):
<element id="Address">
<assignment name="name1" category="cat1" />
</element>
<element id="Address">
<field id="field3">
<assignment name="name5" category="cat2" />
</field>
</element>
<element id="Address">
<field id="field3">
<assignment name="name12" category="cat2" />
</field>
</element>
<element id="PersonInfo">
<field id="field2">
<assignment name="name17" category="cat1" />
</field>
</element>
Я играл вокруг с XPath запросов, но не повезло так далеко. Я ожидал, что
//assignment/ancestor-or-self::*
может сделать трюк, но я, очевидно, был неправ. Есть ли способ достичь того, чего я хочу?
Таким образом, каждая ваша запись имеет верхнюю часть самого родителя: 'element'? – Neijwiert
Спасибо за ваш комментарий - Да. всегда существует. существует иногда, но не всегда. –
Amalia
Можете ли вы использовать XSLT? – Neijwiert