Используйте вложенный запрос в XPath для извлечения нескольких данных одного и того же узла - PullRequest
0 голосов
/ 28 апреля 2020

Я использую XPath для получения информации об элементах в моем документе на основе моей XML схемы. Вот пример элемента:

 <image id = "000003">
        <info>
            <name> Hut Weber - Hitler Chaplin</name>
            <description>
                L'immagine raffigura il volto di Hitler e quello di Charlie Chaplin uno di fianco all'altro (stilizzati).
            </description>
            <company> Hut Weber </company>
            <resolution width = "992" height = "680"/>
            <typeOfAd category = "brand"/>
        </info>
        <rhetoric>
            <framework_1>
                <complexity complexityType = "juxtaposition" degree = "low" value = "0.8"/>
                <richness richnessType = "opposition" degree = "high" value = "0.5"/>
                <explanation>
                    <element name = "Adolf Hitler" position = "../immagini_annotate/000003.jpg#138,194,252,282"/>
                    <element name = "Charlie Chaplin" position = "../immagini_annotate/000003.jpg#566,119,318,358"/>
                    <relationship>
                        La pubblicità vuol fare intendere quanto un cappello possa fare la differenza, 
                        in quanto la silhouette a sinistra può essere associata sia alla figura di Hitler che a quella di Charlie Chaplin, 
                        mentre la silhouette a destra è chiaramente quella di Charlie Chaplin, inconfondibile grazie al suo cappello. 
                        Si lavora per giustapposizione di due immagini e opposizione dei soggetti raffigurati.
                    </relationship>
                </explanation>
            </framework_1>
        </rhetoric>
      </image>

Существует много таких элементов (такая же структура). Я хочу иметь возможность получить, например, имя изображений с атрибутом сложности «complexType», равным «сопоставлению», но я не знаю, как вложить несколько запросов для получения нескольких сведений об одних и тех же элементах. Я попробовал | оператор, но это И, поэтому он дает мне все имена изображений, если я напишу что-то вроде этого ....... | /root/image/info/name/text().

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

С XPath 2.0 вы можете использовать это для получения всех имен изображений из вашего XML, которые соответствуют условию типа сложности:

string-join(//complexity[@complexityType="juxtaposition"]/preceding::name,";")

Проверьте это здесь. https://www.freeformatter.com/xpath-tester.html

Вывод будет выглядеть следующим образом:

"имя первого изображения; имя второго изображения; et c ..."

Альтернатива: используйте XMLstarlet (поддерживает XPath 1.0) и удалите часть string-join() из выражения, которое я опубликовал.

0 голосов
/ 28 апреля 2020

Сначала найдите <image> узлы с типом сложного типа.

/image[rhetoric/framework_1/complexity[@complexityType = 'juxtaposition']]

Затем вы объедините это с информацией / именем.

/image[rhetoric/framework_1/complexity[@complexityType = 'juxtaposition']]/info/name/text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...