为什么google code prettifier拒绝使用XSLT?

时间:2012-04-08 21:43:47

标签: javascript webkit gecko google-code-prettify

google code prettifier(此处也在SO上使用)解析.prettyprint的内容并注入一些<span>以允许通过css突出显示。

这非常简单,除非我使用XSLT提供XML文件。然后,美化剂只能在Opera中正确运行,但拒绝使用Firefox或Chrome(准确地说是Chromium)。我遵循了一个最小的例子,见下文。

如果我直接打开XHTML文件(在服务器上使用xsltproc生成),Firefox会突然设法正确运行prettyprint。但如果它改变了XML本身,美化就会停止工作。我怎么能绕过这个?我可能做错了吗?

这是XML文件

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="test.xslt" type="text/xsl" ?>
<root><![CDATA[
int main() {
  float x {7.7};
  return 0;
}
]]></root>

这是样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml" version="1.0" indent="yes"
    doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
  />
  <xsl:template match="/">
    <html><head>
      <link rel="stylesheet" type="text/css" href="_include/gcp/prettify.css" />
      <script type="text/javascript" src="_include/gcp/prettify.js"> </script>
    </head>
    <body onload="prettyPrint()">
    <pre class="prettyprint"><xsl:value-of select="." /></pre>
    </body></html>
  </xsl:template>

</xsl:stylesheet>

作为参考,这是由xsltproc

生成的XHTML 1.1
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link rel="stylesheet" type="text/css" href="_include/gcp/prettify.css"/>
    <script type="text/javascript" src="_include/gcp/prettify.js"/>
  </head>
  <body onload="prettyPrint()">
    <pre class="prettyprint">
int main() {
  float x {7.7};
  return 0;
}
</pre>
  </body>
</html>

编辑:

这是Firefox呈现的标记(使用 Ctrl + Shift + I 提取)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link rel="stylesheet" type="text/css" href="gcp/prettify.css"/>
    <script type="text/javascript" src="gcp/prettify.js"/>
  </head>
  <body onload="prettyPrint()">
    <pre class="prettyprint">
      <SPAN xmlns=""> </SPAN>
      <SPAN xmlns="">int</SPAN>
      <SPAN xmlns=""> main</SPAN>
      <SPAN xmlns="">()</SPAN>
      <SPAN xmlns=""> </SPAN>
      <SPAN xmlns="">{</SPAN>
      <SPAN xmlns="">
  </SPAN>
      <SPAN xmlns="">float</SPAN>
      <SPAN xmlns=""> x </SPAN>
      <SPAN xmlns="">{</SPAN>
      <SPAN xmlns="">7.7</SPAN>
      <SPAN xmlns="">};</SPAN>
      <SPAN xmlns="">
  </SPAN>
      <SPAN xmlns="">return</SPAN>
      <SPAN xmlns=""> </SPAN>
      <SPAN xmlns="">0</SPAN>
      <SPAN xmlns="">;</SPAN>
      <SPAN xmlns="">
</SPAN>
      <SPAN xmlns="">}</SPAN>
    </pre>
  </body>
</html>

2 个答案:

答案 0 :(得分:0)

也许您可以尝试添加

<script>prettyPrint()</script>
身体之后。我认为Firefox可能会逐行执行代码,因此它会首先尝试执行prettyPrint()并在之后插入XSLT内容,因此prettyPrint()将无法执行任何操作...

答案 1 :(得分:0)

将xsl的输出方法从xml更新为html。

<xsl:output method="html" version="1.0" indent="yes"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>