XPath для возврата конкатенации строк соответствующих значений дочерних узлов - PullRequest
20 голосов
/ 10 сентября 2009

Может ли кто-нибудь предложить формат выражения XPath, который возвращает строковое значение, содержащее объединенные значения определенных соответствующих дочерних узлов элемента, но игнорируя другие:

<div>
    This text node should be returned.
    <em>And the value of this element.</em>
    And this.
    <p>But this paragraph element should be ignored.</p>
</div>

Возвращаемое значение должно быть одной строкой:

This text node should be returned. And the value of this element. And this.

Возможно ли это в одном выражении XPath?

Спасибо.

Ответы [ 6 ]

27 голосов
/ 10 сентября 2009

В XPath 2.0 :

string-join(/*/node()[not(self::p)], '')

18 голосов
/ 10 сентября 2009

В XPath 1.0:

Вы можете использовать

/div//text()[not(parent::p)]

для захвата нужных текстовых узлов. Сама конкатенация не может быть выполнена в XPath 1.0, я рекомендую сделать это в хост-приложении.

6 голосов
/ 10 сентября 2009
/div//text()

двойной слэш заставляет извлекать текст независимо от промежуточных узлов

6 голосов
/ 10 сентября 2009

Этот вид, который работает:

Использование в качестве контекста /div/:

text() | em/text()

Или без использования контекста:

/div/text() | /div/em/text()

Если вы хотите объединить первые две строки, используйте это:

concat(/div/text(), /div/em/text())
0 голосов
/ 18 июня 2013

Если вы хотите, чтобы все дети кроме p, вы можете попробовать следующее ...

    string-join(//*[name() != 'p']/text(), "")

, который возвращает ...

This text node should be returned.
And the value of this element.
And this.
0 голосов
/ 21 мая 2013

Вы также можете использовать цикл for-each и собирать значения в переменную, подобную этой

<xsl:variable name="newstring">
    <xsl:for-each select="/div//text()">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:variable>
...