使用XSL删除不需要的标记

时间:2012-01-27 23:03:49

标签: html xslt tags

我有一些未知内容作为描述,可能是这样的:

<description>
  <p>
    <span>
      <font>Hello</font>
    </span>
    World! 
    <a href="/index">Home</a>
  </p>
</description>

可以设想任何HTML标记。我不想要所有的标签。我想要的标签是p,i,em,strong,b,ol,ul,li和a。例如,&lt; font&gt;将被剥离,但&lt; p&gt;和&lt; a&gt;会留下来的。我假设我必须匹配我想要的(并确保没有什么可以与其他人匹配),但无法解决如何做到这一点。

任何帮助?

1 个答案:

答案 0 :(得分:7)

白名单这些元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[not(self::description or self::p or self::i or 
                               self::em or self::strong or self::b or 
                               self::ol or self::ul or self::li or self::a)]"/>
</xsl:stylesheet>

请注意,这会删除不需要的元素以下的任何内容。例如,要剥离font元素本身,但允许其子元素,请修改上一个模板,如下所示:

<xsl:template match="*[not(self::description or self::p or self::i or 
                           self::em or self::strong or self::b or 
                           self::ol or self::ul or self::li or self::a)]"/>
    <xsl:apply-templates/>
</xsl:template>

等效(稍微清洁)的解决方案:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="@*|node()" priority="-3">
        <xsl:copy/>
    </xsl:template>
    <xsl:template match="description|p|i|em|strong|b|ol|ul|li|a">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*"/>
</xsl:stylesheet>

相反的方法是黑名单不需要的元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="font|span"/>
</xsl:stylesheet>

如果您想允许跳过的元素的子项,请再次向最终模板添加apply-templates