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()]) означает: нет текстового узла с непробельные-только текст.