XPath / XSLT删除空标记

时间:2011-10-13 05:44:55

标签: html xml xslt xpath

我想删除仅包含空格/换行符/标签字符的标签,如下所示:

<p>    </p>

如何使用xpath函数和xslt模板执行此操作?

1 个答案:

答案 0 :(得分:10)

此转换(覆盖identity rule):

<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()])表示:没有文本节点   只有非白色空格的文字。