我有一些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
属性,它们在生活中的唯一功能是携带字体大小属性。但是,在示例输出中,您还删除了span
和font
元素。我想应该相信这个例子。
如果我正确理解了这个问题,那么你想要的转换主要是身份转换,但它会改变三件事。
首先,如果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文档,但其他内容保持不变。