Подтвердить что ты не робот

XPath найти все элементы с определенным дочерним node

Не могли бы вы помочь мне найти все элементы b, у которых есть дочерний элемент c в приведенном ниже примере?

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>

Запрос xpath должен возвращать элемент b2

Второй вопрос: Я хочу совместить 2 условия: я хочу получить элемент с именем = "b2" и имеет элемент c Но этот синтаксис, похоже, не работает: //b [@ name= 'b2' и c]

4b9b3361

Ответ 1

Всякий раз, когда структура XML-документа известна, лучше избегать использования псевдо-оператора // XPath, поскольку его использование может привести к большой неэффективности (обход всего дерева документов).

Поэтому я повторяю это выражение XPath для предоставленного XML-документа:

/*/b[c]

Это выбирает любой элемент b, который является дочерним элементом верхнего элемента документа XML и имеет дочерний элемент с именем c.

UPDATE: OP запросил вопрос о секундах всего несколько минут назад:

Второй вопрос: я хочу совместить 2 условия: хочу получить элемент, который имеет имя = "b2" и имеет элемент c. Но это синтаксис, похоже, не работает: //b[@name='b2' and c]

Представленное выражение XPath действительно выбирает именно необходимый элемент.

Вот проверка на основе XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:copy-of select="//b[@name='b2' and c]"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу:

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>

оценивается выражение XPath и правильно выбранный элемент копируется на выход:

<b name="b2">
   <c/>
</b>

Ответ 2

Он должен быть таким же простым, как

//b[c]

то есть. найдите b где-нибудь, у которого есть дочерний элемент c.