【问题标题】:XSL Template-match replace elementXSL 模板匹配替换元素
【发布时间】:2016-04-25 22:24:08
【问题描述】:

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

我有正在发送到浏览器电子邮件客户端 (Outlook) 的 HTML 输出。 Outlook 覆盖了<p> 标记的特性并引入了大间距。

我想设置一个模板匹配来用<div><span> 替换所有<p> 标签。

由于本文未解决的复杂原因,我无法阻止 HTML 中带有 <p> 标签的渲染。

所以可以说我有:

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

我希望输出是

<span>Some text</span>

删除了&lt;p&gt; 标签。

如果我有

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

只要它去掉&lt;p&gt;标签。

它还需要识别没有任何属性的&lt;p&gt;

我想过类似的事情

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

但这不起作用。 &lt;p&gt; 标签仍然出现。

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

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

【问题讨论】:

  • 您是否错误地用xsl-fo 标记了这个问题? XSL-FO 不同于 XSLT。
  • 生成输入 XML 的系统是基于 xsl-fo 的......但你是对的,这与这个问题无关。移除标签。干杯

标签: xslt xhtml template-matching


【解决方案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>

您可以接受吗?如果不是,则必须有一个关于包含span 元素的p 元素的附加规则(模板):

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

或许

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

【讨论】:

  • 谢谢。我正在使用的输入 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 有意义且无法更改。 Click here 获取完整的转换示例。
猜你喜欢
  • 2011-03-08
  • 2011-10-16
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多