Xslt XSL模板匹配替换元素

Xslt XSL模板匹配替换元素,xslt,xhtml,template-matching,Xslt,Xhtml,Template Matching,我已经搜索了论坛,但仍然不清楚这一点。我对这个话题很陌生 我的HTML输出正在发送到浏览器电子邮件客户端(Outlook)。Outlook会覆盖标记的特征,并引入大间距 我想设置一个模板匹配,用或替换所有标记 由于复杂的原因,我无法阻止在HTML中使用标记来呈现HTML,这在本文中将不会讨论 让我们说我有: <p xmlns="http://www.w3.org/1999/xhtml"> <span>Some text</span> </p>

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

我的HTML输出正在发送到浏览器电子邮件客户端(Outlook)。Outlook会覆盖
标记的特征,并引入大间距

我想设置一个模板匹配,用
替换所有
标记

由于复杂的原因,我无法阻止在HTML中使用
标记来呈现HTML,这在本文中将不会讨论

让我们说我有:

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

一些文本

我希望输出是

<span>Some text</span>
一些文本
移除
标记后

如果我有

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

其他一些文本

那么我会很高兴:

<b>Some other text</b>
其他一些文本


其他一些文本
只要它去掉了
标记

它还需要识别没有任何属性的

我想到了类似的事情

<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,但是这种方法存在相当大的困难,我希望避免这种困难


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

您的输入文档,例如此示例:

<p xmlns="http://www.w3.org/1999/xhtml">
   <span>Some text</span>
</p>
这应该让你开始。您还没有告诉我们输出文档是否也应该在名称空间中

目前,仅修改已有的两个模板,结构如下

<p>
  <span/>
</p>
或许

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


您是否错误地将此问题标记为
xsl fo
?XSL-FO不同于XSLT。生成输入XML的系统是基于XSL-FO的。。。但你是对的,这与这个问题无关。移除标签。干杯,谢谢。我正在使用的输入HTML是由其他系统自动生成的,不能更改。不幸的是,这个系统强制添加了我们不想要的段落标记。我很感兴趣的是,当你说p标签将更改为span标签。这正是我认为我的模板匹配会做的。。但它没有这样做。p标签仍然在那里。一定是发生了更多我没看到的事情。我会继续调查。谢谢回答您的问题,是的,我可以使用嵌套的span标记。在这一点上,只要p标记消失了,我就不再关心如何正确地做事情了——它们在某些电子邮件阅读器中引起了头痛,因为Outlook是如何覆盖他们的CSS行为的。@solardb那么,你试过我的建议了吗?在样式表中声明XHTML名称空间?我不是建议您更改输入文档。我有xsl:stylesheet xmlns:xsl=“http://www.w3.org/1999/xsl/Transform”,我还有一个html标记,上面有html xmlns=“http://www.w3.org/1999/xhtml”,我将尝试更改它。(前斜杠之间没有空格)@solardb带有
http://www.w3.org/1999/XSL/Transform
(带有空格)的样式表将导致错误-为什么有空格?XHTML名称空间也是如此。这些名称空间URI具有含义,不能更改。有关转换的完整示例,请参见。
<xsl:template match="xhtml:p">
    <span>
        <xsl:apply-templates select="@*|node()" />
    </span>
</xsl:template>
<p>
  <span/>
</p>
<span>
  <span/>
</span>
<xsl:template match="xhtml:p[xhtml:span]">
<xsl:template match="xhtml:p[//xhtml:span]">