Выражение 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 я не уверен в последней части, хотя. Возможно, тебе придется поиграть с этим.