只针对IE7的样式表,用于XSL文档。

6

如何在XSL页面中添加仅适用于IE7及以下版本的样式表?我尝试将其添加到头信息的模板中,如下所示:

<xsl:template name="header">
<!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" href="/rcm/verisign/style/2012/ie7.css"/>
<![endif]-->
</xsl:template>

即使我在仅包含HTML的文档中使用相同的代码段,条件语句也从未被执行。出了什么问题?


你需要为条件/ie专用样式表添加文档类型声明吗?你有吗? - Andy
据我所知,没有这样的事情。我只有一个XHTML 1.0 strict doctype。 - user1436111
3个回答

3

这个注释会被解析器视为XSL中的注释,从生成的HTML代码中删除。

如果你想在HTML中生成注释,你需要将其包含在CDATA块中,这样它就会被XSL解析器视为纯文本,直接复制到目标文档中。

代码应该是这样的:

<![CDATA[  <!--[if lte IE 7]>
  <link rel="stylesheet" type="text/css" href="/rcm/verisign/style/2012/ie7.css"/>
  <![endif]-->
]]>

<![CDATA[]]>之间的所有内容将被视为纯文本。

希望这能回答你的问题。

但是,如果可能的话,我建议最好的解决方案是放弃支持IE7。它的使用统计数据在过去六个月左右已经下降到了谷底 - 它几乎和IE6一样少,几乎没有人再使用它了。我知道在某些情况下你可能没有选择,但如果你有选择,我的建议是放弃它。

[编辑]

好吧,经过进一步的研究,看起来你是对的:一个普通的CDATA块确实会转义其输出(尽管许多地方声称不是这样)。

相反,您需要使用<xsl:comment>在输出中生成HTML注释。使用条件注释语法会变得非常混乱,而且您可能仍然需要使用CDATA。

我能找到的最好的例子在这里:http://getsymphony.com/download/xslt-utilities/view/21798/

正如您所看到的,这是相当多的代码。

一个简短的版本(没有灵活性)可能是这样的:

<xsl:comment>
    [if lte 7<![CDATA[>]]>
    <link rel="stylesheet" type="text/css" href="/rcm/verisign/style/2012/ie7.css"/>
    <![CDATA[<![endif]]]>
</xsl:comment>

希望这能有所帮助。很抱歉,原始回答不完整。

谢谢!你知道cdata块会是什么样子吗?我以前从未使用过。 - user1436111
我添加了 <![CDATA[[if lte IE 7]><link rel="stylesheet" type="text/css" href="ie7.css"/><![endif]]>,但是当我在文档中查看源代码时,所有的括号都被转换为 < 和 >。有什么建议吗? - user1436111
实际上,抱歉,还有最后一件事——它仍然无法工作,因为在呈现的页面中,CDATA块内的<和>变成了<和>。 - user1436111
@user1436111 - 这很奇怪。它不应该这样做... CDATA 的整个重点在于将内容视为纯文本并不解析它。请参阅http://msdn.microsoft.com/en-us/library/ms256076.aspx。 - Spudley
@user1436111 - 进行了进一步的研究,完善了答案。 - Spudley

1

这里有一种经过验证的方法可以做到这一点——这是DOE有用的罕见情况之一:

<xsl:text disable-output-escaping="yes">
        &lt;!--[if lte IE 7]>
        &lt;link rel="stylesheet" type="text/css" href="/rcm/verisign/style/2012/ie7.css"/>
        &lt;![endif]-->
</xsl:text>

一个完整的例子:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="/*">
    <xsl:text disable-output-escaping="yes">
        &lt;!--[if lte IE 7]>
        &lt;link rel="stylesheet" type="text/css" href="/rcm/verisign/style/2012/ie7.css"/>
        &lt;![endif]-->
    </xsl:text>
     <p>
       Done.
     </p>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于任何 XML 文档(未使用),将产生所需的正确结果

<!--[if lte IE 7]>
        <link rel="stylesheet" type="text/css" href="/rcm/verisign/style/2012/ie7.css"/>
        <![endif]-->
<p>
       Done.
     </p>

-1

你有:

<!--[if lte IE 7]>

应该是:

<!--[if lt IE 7]>

1
不,lte 是正确的。它的意思是“小于或等于”,这正是他想要的。 - Spudley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接