XSLT 试图在本地引用默认的 Mozilla 样式

XSLT trying to locally reference default Mozilla styles

我想了解更多默认的 Mozilla XSLT 是如何工作的,因为我喜欢默认显示 XML 文档的方式,并且可以展开/最小化各种节点。

我获得了以下副本:

我无法以相同的方式找到以下内容,而是通过 Mozilla 浏览器获取它们,并将它们保存在本地。 IE。

chrome://global/locale/xml/prettyprint.dtd

所有四个文件都保存在同一个文件夹中。

准备了一些简单的XML保存在同一个文件夹中:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="XMLPrettyPrint.xsl"?>
<breakfast_menu>
    <food>
        <name>Belgian Waffles</name>
        <price>.95</price>
    </food>
    <food>
        <name>Strawberry Belgian Waffles</name>
        <price>.95</price>
    </food>
</breakfast_menu>

在 XMLPrettyPrint.xsl 中我编辑了以下内容:

<xsl:template match="/">
  <link href="chrome://global/content/xml/XMLPrettyPrint.css" type="text/css" rel="stylesheet"/>
  <link title="Monospace" href="chrome://global/content/xml/XMLMonoPrint.css" type="text/css" rel="alternate stylesheet"/>
  ...
</xsl:template>

<xsl:template match="/">
  <link href="XMLPrettyPrint.css" type="text/css" rel="stylesheet"/>
  <link title="Monospace" href="XMLMonoPrint.css" type="text/css" rel="alternate stylesheet"/>
  ...
</xsl:template>

如果我打开 XML 文件 Mozilla,它只能部分工作。文档看起来格式正确,但颜色不存在,节点也没有折叠。

我还需要更改什么?

编辑 2016.03.29 @16:00

<xsl:template match="/">
<html>
<head>
  <link href="XMLPrettyPrint.css" type="text/css" rel="stylesheet"/>
  <link title="Monospace" href="XMLMonoPrint.css" type="text/css" rel="alternate stylesheet"/>
  <div id="header" dir="&locale.dir;">
    <p>
      &xml.nostylesheet;
    </p>
  </div>
</head>
<body>
  <xsl:apply-templates/>
</body>
</html>
</xsl:template>

更新为@import url

/*@import url("resource://gre-resources/viewsource.css");*/
@import url("viewsource.css");

语法突出显示(着色)CSS 规则在 viewsource.css 文件中定义,但它们仅适用于在 highlight class 中具有祖先的元素.

XMLPrettyPrint.xsl 文件不会生成带有 highlight class 的任何内容,因此您可以通过包装第一个 xsl:template 中的 <xsl:apply-templates/> 来解决这个问题] 在 div 中有这个 class:

<div class="highlight">
  <xsl:apply-templates/>
</div>

现在结果以彩色呈现,但它们太靠近左侧并且根元素上的 丢失了。这是因为 Mozilla 漂亮的打印渲染器似乎用一些填充包围了结果,并且 divexpander class 中,它的左边距为 -16px

您可以通过在包装器 div 左侧填充 16 像素来解决此问题:

<div class="highlight" style="padding-left: 16px">
  <xsl:apply-templates/>
</div>

您需要 JavaScript 才能使用 expand/collapse 功能。 XMLPrettyPrint.xml 文件为此定义了代码。您可以通过将它放在 <script> 元素中来将其包含在您的 XSLT 中。

为了附加事件,您可以给包装器 div 一个 ID 和 select 它来附加事件:

<div id="content" class="highlight" style="padding-left: 16px">
  <xsl:apply-templates/>
</div>
<script>
    <![CDATA[
    document.getElementById('content').addEventListener('click', function (event) {
        try {
            var par = event.target;
            if (par.nodeName == 'div' && par.className == 'expander') {
                if (par.parentNode.className == 'expander-closed') {
                    par.parentNode.className = 'expander-open';
                    par.firstChild.data = '\u2212';
                }
                else {
                    par.parentNode.className = 'expander-closed';
                    par.firstChild.data = '+';
                }
            }
        } catch (e) {
        }
    });
    ]]>
</script>

完成后,呈现的 HTML 应该像 Mozilla 的默认呈现器一样运行。