Как получить текстовое значение из элемента на основе значения его родственного атрибута? - PullRequest
1 голос
/ 30 мая 2020

Пример xml:

<root>
    <ns1:agent ns2:about="a3">
        <ns2:name xml:lang="en">Helen</ns2:name>
        <ns2:age>26</ns2:age>
    </ns1:agent>
    <ns1:agent ns2:about="a1">
        <ns2:name xml:lang="en">John</ns2:name>
        <ns2:age>26</ns2:age>
    </ns1:agent>
    <ns1:agent ns2:about="a2">
        <ns2:name xml:lang="en">Mike</ns2:name>
        <ns2:age>30</ns2:age>
    </ns1:agent>
    ...
    <!-- More ns1:agent nodes -->
    ...
    <ns3:person ns2:id="a1"/>
    <ns3:person ns2:id="a2"/>
    <ns3:person ns2:id="a3"/>
    ...
    <!-- More ns3:person nodes -->
    ...
</root>

Итак, как получить текстовое значение элемента agent / name на основе его атрибута about, начиная с элемента person, используя XPath?

Изменить : Выражение XPath будет использоваться в al oop для каждого узла ns3: person, поэтому я не знаю заранее заданное значение атрибута c id.

Ответы [ 2 ]

1 голос
/ 01 июня 2020

Если я правильно понимаю ваш вопрос, вы ищете выражение xpath вроде этого:

    //ns1:agent[@ns2:about=//ns3:person/@ns2:id]/ns2:name

Чтобы проверить его, я бы изменил ваши ns3:persons узлы в вашем примере xml с

<ns3:person ns2:id="a1"/>
<ns3:person ns2:id="a2"/>
<ns3:person ns2:id="a3"/>

на

<ns3:person ns2:id="a7"/>
<ns3:person ns2:id="a2"/>
<ns3:person ns2:id="a9"/>

, чтобы только один случайный ns1:agent соответствовал одному случайному ns3:person. Если вы это сделаете, то выражение xpath выберет Mike в качестве имени цели.

1 голос
/ 30 мая 2020

Если вы правильно объявили префиксы пространства имен ns1, ns2 и ns3, этот XPath,

//ns3:person[@ns2:id = "a1"]/preceding-sibling::ns1:agent[1]/ns2:name

выберет имя агента, непосредственно предшествующего идентифицированному человеку.

Если вам нужна помощь в объявлении префиксов пространств имен XML, см. Как XPath работает с пространствами имен XML?


Обновление на основе OP комментарий:

В моем исходном документе xml узел агента не находится непосредственно перед узлом человека. Я буду запускать выражение в al oop для каждого узла person. Извините за путаницу, я отредактировал пример и вопрос, чтобы было более ясно, что мне нужно.

И в отредактированном вопросе:

Изменить: выражение XPath будет использоваться в al oop для каждого узла ns3: person, поэтому я не знаю заранее заданное значение атрибута c id.

Итак, в вашем l oop просто привяжите переменную, скажем $id, в текущий ns3:person/@n2:id, а затем проверьте ее в XPath:

//ns1:agent[@ns2:about = $id]/ns2:name

См. также Как передать параметр переменной в выражение XPath?

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