XSL模板匹配替换元素

时间:2016-01-20 07:24:23

标签: xslt xhtml template-matching

我已经搜索了论坛,但仍然不清楚这一点。我对这个话题很陌生。

我将HTML输出发送到浏览器电子邮件客户端(Outlook)。 Outlook会覆盖SELECT id, CONCAT_ws (',', IF ( exporter1 = 1, 'exporter1',NULL), IF ( exporter2 = 1, 'exporter2',NULL), IF ( exporter2 = 3, 'exporter3',NULL) ) FROM forms; 标记的特征并引入大间距。

我想设置一个模板匹配,用<p><p>替换所有<div>代码。

由于本篇文章中未解决的复杂原因,我无法阻止HTML在其中使用<span>标记进行呈现。

所以我要说:

<p>

我希望输出为

<p xmlns="http://www.w3.org/1999/xhtml">
   <span>Some text</span>
</p>

删除了<span>Some text</span> 代码。

如果我有

<p>

然后我会很满意:

<p xmlns="http://www.w3.org/1999/xhtml">
  <b>Some other text</b>
</p>

<b>Some other text</b>

只要它摆脱<span> <b>Some other text</b> </span> 标签。

还需要识别没有任何属性的<p>

我想过像

这样的东西
<p>

但这不起作用。 <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="p"> <span> <xsl:apply-templates select="@*|node()" /> </span> </xsl:template> 标记仍然显示。

可以编写一个在将HTML发送到smtp服务器并对其进行操作之前拦截HTML的适配器,但是我希望避免这种方法存在相当大的困难。

甚至可以做我正在尝试的事情吗?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的输入文档,例如:

<p xmlns="http://www.w3.org/1999/xhtml">
   <span>Some text</span>
</p>

拥有默认命名空间。这是一件好事,因为有效的XHTML文档必须位于命名空间中。

这意味着默认情况下,此命名空间适用于文档中的所有元素,您必须在XSLT样式表中对此进行说明。在那里重新声明这个命名空间:

<xsl:stylesheet xmlns:xhtml="http://www.w3.org/1999/xhtml">

每当您从输入文档中引用元素时,前缀包含xhtml:的元素:

<xsl:template match="xhtml:p">
    <span>
        <xsl:apply-templates select="@*|node()" />
    </span>
</xsl:template>

这应该让你开始。您还没有告诉我们输出文档是否也应该在命名空间中。

目前,只修改您已有的两个模板,如

<p>
  <span/>
</p>

最终将成为

<span>
  <span/>
</span>

这对你来说可以接受吗?如果没有,则必须有一个关于包含p元素的span元素的附加规则(模板):

<xsl:template match="xhtml:p[xhtml:span]">

或者

<xsl:template match="xhtml:p[//xhtml:span]">