【问题标题】:Changing the font-size attribute in XHTML tags through XSLT通过 XSLT 更改 XHTML 标记中的 font-size 属性
【发布时间】:2013-08-14 19:16:26
【问题描述】:

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

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

【问题讨论】:

    标签: xhtml xslt-1.0


    【解决方案1】:

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

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

    如果我对问题的理解正确,您需要的转换主要是身份转换,但会改变三件事。

    首先,如果 style 属性包含的只是 font-size 设置,则您要抑制它们。在一般情况下,如果不在 XSLT 中编写 CSS 解析器,这实际上并不容易可靠地完成,但是让我们假设您可以通过更简单的测试来解决问题:如果 style 属性以 font-size 设置开头,它就会死掉。

    如果您使用的是像 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 文档。

    【讨论】:

    • 效果很好!也非常感谢您的解释。我有一种感觉,我正在努力实现超越简单转换的目标。
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多