XPath / XSLT Удалить пустые теги - PullRequest
7 голосов
/ 13 октября 2011

Я хотел бы удалить теги, которые содержат только символы пробела / новой строки / табуляции, как показано ниже:

<p>    </p>

Как бы вы это сделали, используя функции xpath и шаблоны xslt?

1 Ответ

10 голосов
/ 13 октября 2011

Это преобразование (переопределяющее правило идентификации ):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...