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

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

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

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

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

This is an example bolded text

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

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

3 ответов


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

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

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

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

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 элементы могут быть проблемой.


использовать:

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

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

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

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

использовать:

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

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

<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="string(//div[@id='theNode'])"/>"
===========
  "<xsl:copy-of select="normalize-space(string(//div[@id='theNode']))"/>"
 </xsl:template>
</xsl:stylesheet>

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

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

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

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

Как насчет этого :

/div / text () [1]//div | span /text ()//div | b /text ()/ / div / text()[2]

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