Выражение XPath для выделения всего текста в данном узле и текста его chldren

В основном мне нужно очистить текст, который имеет вложенные теги.

Что-то вроде этого:

<code><div id='theNode'>
This is an <span style="color:red">example</span> <b>bolded</b> text
</div>
</code>

И я хочу выражение, которое будет производить это:

<code>This is an example bolded text
</code>

Я боролся с этим в течение часа или более без результата.

Любая помощь приветствуется

 Dimitre Novatchev03 мая 2012 г., 04:40
Возможно, вы захотите взглянуть на мой ответ, который, в отличие от принятого в настоящее время ответа, является правильным.

Ответы на вопрос(3)

Решение Вопроса

строковое значение узла элемента - это объединение строковых значений всех потомков текстового узла узла элемента в порядке документа.

Вы хотите позвонить в XPathstring() функция на элементе div.

string(//div[@id='theNode'])

Вы также можете использоватьнормализуют-пространство функция для уменьшения нежелательных пробелов, которые могут появиться из-за переносов строк и отступов в исходном документе. Это удалит начальные и конечные пробелы и заменит последовательности пробельных символов одним пробелом. Когда вы передаете набор узлов в normalize-space (), набор узлов сначала преобразуется в его строковое значение. Если в normalize-space не передаются аргументы, он будет использовать узел контекста.

normalize-space(//div[@id='theNode'])

// if theNode was the context node, you could use this instead
normalize-space()

Возможно, вы захотите использовать более эффективный способ выбора узла контекста, чем пример XPath, который я использовал. Например, следующий пример Javascript может быть запущен для этой страницы в некоторых браузерах.

var el = document.getElementById('question');
var result = document.evaluate('normalize-space()', el, null ).stringValue;

Только пробельный текстовый узел междуspan а такжеb элементы могут быть проблемой.

 03 мая 2012 г., 09:23
Предположительно, ответ был отредактирован после комментария Димитра, поэтому комментарий больше не применим.
 Martin Taleski03 мая 2012 г., 04:19
спасибо, работает отлично!
 03 мая 2012 г., 04:28
@MartinTaleski: выражение XPath в этом ответе оценивается как строка"true", Это действительно то, что вы хотите получить?

Use:

Когда это выражение вычисляется, результатом является строковое значение первого (и, надеюсь, только)div элемент в документе.

Поскольку строковое значение элемента определяется вСпецификация XPath как конкатенация в порядке документа всех его потомков текстового узла, это в точности искомая строка.

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

Use:

normalize-space()

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:template match="/">
  "<xsl:copy-of select=""/>"
===========
  "<xsl:copy-of select="normalize-space()"/>"
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the provided XML document:

<div id='theNode'> This is an 
    <span style="color:red">example</span>
    <b>bolded</b> text 
</div>

the two XPath expressions are evaluated and the results of these evaluations are copied to the output:

  " This is an 
    example
    bolded text 
"
===========
  "This is an example bolded text"

/ div / text () [1] | / div / span / text () | / div / b / text () | / Дела / текст () [2]

Хм, я не уверен насчет последней части. Возможно, вам придется поиграть с этим.

Ваш ответ на вопрос