Тема: XML/XSL: Обработка всех текстовых узлов всех тегов
Решил выделить вопрос коллеги Serge Yolkin и свой же ответ в отдельную тему. Взято отсюда HTA: XML Viewer.
А не подскажете ли, как с помощью xslt преобразования можно обрабатывать текстовые ноды по отдельности? Ну, для примера: из xml
<root> <tag1> текст1 <tag2> текст2 <tag3/> текст3 </tag2> </tag1> текст4 </root>
получить html
<p>текст1</p> <p>текст2</p> <p>текст3</p> <p>текст4</p>
причём, в общем случае (без привязки к именам тэгов и структуре дерева).
Я не так часто сталкиваюсь с задачами xslt-преобразований, чтобы уверенно утверждать. Однако же, мне кажется эта задача весьма специфичной. Чаще всего требуется получить определенную информацию из заданной структуры. Тем не менее, ниже представлен наиболее вероятный вариант решения.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//*/text()">
<xsl:if test="normalize-space() != ''">
<p><xsl:value-of select="normalize-space()" /></p>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Или более короткий вариант:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//*/text()">
<p><xsl:value-of select="normalize-space()" /></p>
</xsl:template>
</xsl:stylesheet>
Если же необходимо чтобы каждый новый тег <p> распологался на отдельной строке (как показано в запросе):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//*/text()">
<xsl:text><![CDATA[
]]></xsl:text>
<p><xsl:value-of select="normalize-space()" /></p>
</xsl:template>
</xsl:stylesheet>