使用 XSL 删除不需要的标签

发布于 2024-12-29 07:49:04 字数 436 浏览 0 评论 0原文

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

<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。因此,例如,会被剥离,但是

会留下来。我假设我必须匹配我想要的(并确保没有什么可以匹配其他的),但无法弄清楚如何做到这一点。

有什么帮助吗?

I've got some unknown content coming in as a description, maybe something like this:

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

There could conceivable be any HTML tag. I don't want all the tags. The tags I want to allow are p, i, em, strong, b, ol, ul, li and a. So, for example, <font> would be stripped, but <p> and <a> would remain. I'm assuming I have to match the ones I want (and make sure there's nothing to match the others), but can't work out how to do it.

Any help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怀中猫帐中妖 2025-01-05 07:49:04

将这些元素列入白名单

<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 添加到最终模板。

Whitelist those elements:

<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>

Note that this removes the undesired elements and anything below them. To just strip the font element itself, for example, but allow its children, modify the last template like this:

<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>

An equivalent (and slightly cleaner) solution:

<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>

The opposite approach is to blacklist the unwanted elements:

<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>

Again, add an apply-templates to the final template if you want to allow children of the skipped elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文