Ответ 1
В XPath 1.0:
Вы можете использовать
/div//text()[not(parent::p)]
для захвата требуемых текстовых узлов. Сама конкатенация не может быть выполнена в XPath 1.0, я рекомендую сделать это в главном приложении.
Может кто-нибудь предложить формат выражения 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?
Спасибо.
В XPath 1.0:
Вы можете использовать
/div//text()[not(parent::p)]
для захвата требуемых текстовых узлов. Сама конкатенация не может быть выполнена в XPath 1.0, я рекомендую сделать это в главном приложении.
В XPath 2.0:
string-join(/*/node()[not(self::p)], '')
/div//text()
силы двойной косой черты для извлечения текста независимо от промежуточных узлов
Этот вид, который работает:
Использование в качестве контекста /div/
:
text() | em/text()
Или без использования контекста:
/div/text() | /div/em/text()
Если вы хотите выполнить первые две строки, используйте это:
concat(/div/text(), /div/em/text())
Если вам нужны все дети, кроме p, вы можете попробовать следующее...
string-join(//*[name() != 'p']/text(), "")
который возвращает...
This text node should be returned.
And the value of this element.
And this.
Вы также можете использовать цикл for-each и собирать значения в переменной, подобной этой
<xsl:variable name="newstring">
<xsl:for-each select="/div//text()">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>