XPath / XSLT удалить пустые Теги
Я хотел бы удалить теги, которые содержат только пробелы / символы новой строки / вкладки, как показано ниже:
<p> </p>
Как бы вы это сделали, используя функции xpath и шаблоны xslt?
1 ответов
это преобразование (переопределение правила удостоверения):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(*) and not(text()[normalize-space()])]"/>
</xsl:stylesheet>
при применении к следующему XML-документу:
<t>
<a>
<b>
<c/>
</b>
</a>
<p></p>
<p> </p>
<p>Text</p>
</t>
правильно производит желаемый результат:
<t>
<a>
<b/>
</a>
<p>Text</p>
</t>
помните: использование и переопределение правила идентификации / шаблона является наиболее фундаментальным и мощным шаблоном дизайна XSLT. Это правильный выбор для различных проблем, где большинство узлов должны быть скопированы без изменений и только некоторые определенные узлы должны быть изменены, удалены, переименованы ..., п.
Примечание: @Abel в своем комментарии рекомендует, чтобы некоторые биты этого решения нуждались в дальнейшем объяснении:
для непосвященных и любопытных:
not(*)
означает: не иметь ребенка элемент;not(text()[normalize-space()])
означает: нет текстового узла с непробельные-только текст.