一个模板match="font size"
根本不应该匹配任何东西,但是您显示的模板应该复制它匹配的元素和该元素的所有属性,以及处理该元素的所有子节点。因此,如果您显示的模板实际上正在触发,则它根本不应该从输入中删除任何节点。我推断您粘贴的内容不是您正在运行的代码的准确反映,或者您误解了您正在观察的行为。
您说您要“删除所有字体大小属性”,我认为这是指所有style
在生活中唯一功能是携带字体大小属性的属性。但是,在您的示例输出中,您还删除了span
andfont
元素。我想应该相信这个例子。
如果我正确理解了这个问题,您需要一个主要是身份转换的转换,但它改变了三件事。
style
首先,如果属性包含的只是一个font-size
设置,则您要抑制它们。在一般情况下,如果不在您的 XSLT 中编写 CSS 解析器,这实际上并不容易可靠地完成,但是让我们假设您可以通过一个更简单的测试来完成:如果一个style
属性以字体大小设置开始,它就会消失。
如果您使用像 XSLT 1.0 规范中给出的普通身份转换,那么您的转换已经有一个处理属性的规则。我们想为这组样式属性覆盖它,我们想完全抑制它。写:
<xsl:template match="@style[starts-with(.,'font-size')]"/>
其次,您要抑制带有以字体大小设置开头的样式属性的 span 元素。(实际上,更智能的测试也可能会检查是否缺少“类”属性和其他内容;我将把它留给读者作为练习。)在这里你不想压制内容,但你不想' t 想要输出中的元素。所以模板的内容只是对apply-templates的调用:
<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 文档。