通过XSLT更改XHTML标记中的字体大小属性



我有一些XHTML,看起来像这个

<span style="font-size:8px;"><font size="3"><strong style="font-size:14pt;">EXAM:  </strong>Head</font></span>

我想删除所有的字体大小属性,使其看起来像这个

<strong>EXAM:  </strong>Head

我试过

<xsl:template match="font size">
  <xsl:copy>
    <xsl:copy-of select="@*" />
      <xsl:apply-templates select="node()" />
  </xsl:copy>
</xsl:template>

但这会删除整个节点。有什么建议吗?

具有match="font size"的模板不应该与任何内容匹配,但显示的模板应该复制它匹配的元素和该元素的所有属性,并处理该元素的全部子节点。因此,如果您显示的模板实际上正在启动,那么它不应该从输入中删除任何节点。我推断,要么你粘贴的不是你正在运行的代码的准确反映,要么你误解了你正在观察的行为。

你说你想"删除所有字体大小属性",我认为这是指所有style属性,它们在生活中的唯一功能是携带字体大小属性。但是,在示例输出中,您还删除了spanfont元素。我想应该相信这个例子。

如果我正确理解了这个问题,那么你想要的转换主要是身份转换,但它会改变三件事。

首先,如果style属性只包含一个font-size设置,则需要抑制这些属性。在一般情况下,如果不在XSLT中编写CSS解析器,这实际上并不容易可靠地完成,但让我们假设您可以通过一个更简单的测试:如果style属性以字体大小设置开始,它就会失效。

如果您使用的是像XSLT1.0规范中给出的那样的普通标识转换,那么您的转换已经有了处理属性的规则。我们想为这组样式属性覆盖它,我们想完全抑制它。写入:

<xsl:template match="@style[starts-with(.,'font-size')]"/>

其次,您希望抑制带有以字体大小设置开头的样式属性的span元素。(事实上,更聪明的测试可能还会检查是否缺少"class"属性和其他内容;我将把它留给读者练习。)在这里,你不想抑制内容,但你不想在输出中包含元素。因此,模板的内容只是应用模板的调用:

<xsl:template match="xh:span
                     [starts-with(@style,'font-size')]">
  <xsl:apply-templates/>
</xsl:template>

最后,您想对字体元素做同样的事情:处理它们的内容,但删除元素本身:

<xsl:template match="xh:font">
  <xsl:apply-templates/>
</xsl:template>

用这三个模板增强的身份转换可以将包含输入的XHTML文档正确地转换为包含输出的类似XHTML文档,但其他内容保持不变。

相关内容

  • 没有找到相关文章

最新更新