Вопрос по xml – XPath находит все элементы с определенным дочерним узлом

40

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

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

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

Второй вопрос Я хочу объединить 2 условия: я хочу получить элемент с именем = & quot; b2 & quot; и имеет элемент с Но этот синтаксис, кажется, не работает: // б [@ Name = & APOS; b2 & APOS; и с]

Что именно означает "кажется, не работает"? Пожалуйста, задайте новый отдельный вопрос и предоставьте полный (как можно меньший) исходный XML-документ, используемое выражение XPath, требуемый результат и фактический полученный результат. С текущим XML-документом выражение XPath//b[@name='b2' and c] выбирает второго ребенкаa - именно так, как и должно быть. Dimitre Novatchev

Ваш Ответ

2   ответа
46

Whenever the structure of the XML document is known, it is better to avoid using the // XPath pseudo-operator, так как его использование может привести к большой неэффективности (обход всего дерева документов).

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

/*/b[c]

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

UPDATE: ОП задал второй вопрос несколько минут назад:

The second question is I want to combine 2 conditions: I want to get the element which have name = "b2" and has the element c But this syntax seems not to work: //b[@name='b2' and c]

The provided XPath expression does select exactly the wanted element.

Here is XSLT - based verification:

<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>

When this transformation is applied on the provided XML document:

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

the XPath expression is evaluated and the correctly-selected element is copied to the output:

<b name="b2">
   <c/>
</b>
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded//some-element-deep-within-the-domError: User Rate Limit Exceededevery //some-element-deep-within-the-domError: User Rate Limit Exceeded//some-element-deep-within-the-domError: User Rate Limit Exceeded
Error: User Rate Limit ExceededregardlessError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded nam
20

Это должно быть так просто, как

//b[c]

то есть найтиb везде, где естьc ребенок.

Error: User Rate Limit Exceeded nam
Error: User Rate Limit Exceeded

Похожие вопросы