通过XSLT更改XHTML标记中的font-size属性

时间:2013-08-14 19:16:26

标签: xhtml xslt-1.0

我有一些看起来像这样的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>

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

1 个答案:

答案 0 :(得分:0)

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

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

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

首先,如果style属性包含font-size设置,则要取消style属性。在没有在XSLT中编写CSS解析器的情况下,这在一般情况下实际上并不容易,但是我们假设您可以通过更简单的测试来完成:如果<xsl:template match="@style[starts-with(.,'font-size')]"/> 属性以字体大小设置开头,则模具

如果您使用的是XSLT 1.0规范中给出的正常身份转换,那么您的转换已经有了处理属性的规则。我们想要为这组样式属性覆盖它,我们想要完全抑制它们。写:

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

其次,您要抑制带有以字体大小设置开头的样式属性的span元素。 (实际上,一个更聪明的测试也可能会检查是否缺少“类”属性和其他东西;我会将其作为练习留给读者。)在这里你不想压制内容,但你不要t想要输出中的元素。所以模板的内容只是对apply-templates的调用:

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

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

{{1}}

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