Ответ 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>