如何使用 Greasemonkey 设置 XML 片段的样式?
How to style an XML fragment with Greasemonkey?
我正在尝试使用 Greasemonkey 脚本对来自服务器响应的 XML 片段进行样式化。
Example XML fragment from w3schools.com:
<note>
<to> Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
(它没有像<?xml version="1.0" encoding="UTF-8"?>
一样在顶部声明)
Firefox 报告:
This XML file does not appear to have any style information associated
with it. The document tree is shown below.
如何设置显示样式?
我可以将其转换为正确的 HTML 吗?怎么样?
N.B. 我可以使用 XHR 抓取和解析数据,但我试图避免使用 XHR 并使用浏览器来显示数据(因为它是一个获取方法)。我只需要将其格式化为更易读的格式。
您 "style" XML 使用 Extensible Stylesheet Language Transformations (XSLT)。 XSLT 使用样式表将 XML 解析为 HTML。然后,您可以使用标准 CSS 来格式化结果 HTML.
的显示
对于 the sample XML you cited,此样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="note">
<p> <xsl:value-of select="body"/> </p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
会给你一个格式正确的 HTML 文档,其中只列出了 note
正文。 EG:Don't forget me this weekend!
来自你的例子。
在 Greasemonkey 脚本中使用 XSLTProcessor()
到 运行 XSLT,如下所示:
// ==UserScript==
// @name _XML renderer / styler
// @description stylesheet for xml results
// @include http://YOUR_SERVER.COM/YOUR_PATH/*.xml
// @include http://www.w3schools.com/xml/note.xml
// @grant none
// ==/UserScript==
//-- Warning, multiline str is new in JS. Only Firefox supports at the moment.
var xsl_str = `<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>My super new note format!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { padding: 0 2em; }
.noteCtr {
border: 1px solid gray;
border-radius: 1ex;
padding: 0;
background: #FAFAFA;
}
.messPeople { font-size: 1em; margin: 1ex 1em; }
.messHeading { background: lightcyan; margin: 0 1.6ex; }
.messHeading::after { content: ":"; }
.noteCtr > p {
background: white;
padding: 1em;
margin: 0 1em 1.5ex 1em;
}
</style>
</head>
<body>
<xsl:for-each select="note">
<div class="noteCtr">
<h3 class="messPeople">
<xsl:value-of select="from"/>
-->
<xsl:value-of select="to"/>
</h3>
<h3 class="messHeading"> <xsl:value-of select="heading"/> </h3>
<p> <xsl:value-of select="body"/> </p>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
`;
var processor = new XSLTProcessor ();
var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml");
processor.importStylesheet (dataXSL);
var newDoc = processor.transformToDocument (document);
//-- These next lines swap the new, processed doc in for the old one...
window.content = newDoc;
document.replaceChild (
document.importNode (newDoc.documentElement, true),
document.documentElement
);
这里我将样式表存储在 xsl_str
变量中。对于更复杂的操作,您可能会发现 fetch the stylesheet via a @resource
directive.
更好
安装该脚本,然后访问 your example XML。
您将看到它转换该文档...
发件人:
收件人:
我正在尝试使用 Greasemonkey 脚本对来自服务器响应的 XML 片段进行样式化。
Example XML fragment from w3schools.com:
<note>
<to> Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
(它没有像<?xml version="1.0" encoding="UTF-8"?>
一样在顶部声明)
Firefox 报告:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
如何设置显示样式?
我可以将其转换为正确的 HTML 吗?怎么样?
N.B. 我可以使用 XHR 抓取和解析数据,但我试图避免使用 XHR 并使用浏览器来显示数据(因为它是一个获取方法)。我只需要将其格式化为更易读的格式。
您 "style" XML 使用 Extensible Stylesheet Language Transformations (XSLT)。 XSLT 使用样式表将 XML 解析为 HTML。然后,您可以使用标准 CSS 来格式化结果 HTML.
的显示对于 the sample XML you cited,此样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="note">
<p> <xsl:value-of select="body"/> </p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
会给你一个格式正确的 HTML 文档,其中只列出了 note
正文。 EG:Don't forget me this weekend!
来自你的例子。
在 Greasemonkey 脚本中使用 XSLTProcessor()
到 运行 XSLT,如下所示:
// ==UserScript==
// @name _XML renderer / styler
// @description stylesheet for xml results
// @include http://YOUR_SERVER.COM/YOUR_PATH/*.xml
// @include http://www.w3schools.com/xml/note.xml
// @grant none
// ==/UserScript==
//-- Warning, multiline str is new in JS. Only Firefox supports at the moment.
var xsl_str = `<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>My super new note format!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { padding: 0 2em; }
.noteCtr {
border: 1px solid gray;
border-radius: 1ex;
padding: 0;
background: #FAFAFA;
}
.messPeople { font-size: 1em; margin: 1ex 1em; }
.messHeading { background: lightcyan; margin: 0 1.6ex; }
.messHeading::after { content: ":"; }
.noteCtr > p {
background: white;
padding: 1em;
margin: 0 1em 1.5ex 1em;
}
</style>
</head>
<body>
<xsl:for-each select="note">
<div class="noteCtr">
<h3 class="messPeople">
<xsl:value-of select="from"/>
-->
<xsl:value-of select="to"/>
</h3>
<h3 class="messHeading"> <xsl:value-of select="heading"/> </h3>
<p> <xsl:value-of select="body"/> </p>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
`;
var processor = new XSLTProcessor ();
var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml");
processor.importStylesheet (dataXSL);
var newDoc = processor.transformToDocument (document);
//-- These next lines swap the new, processed doc in for the old one...
window.content = newDoc;
document.replaceChild (
document.importNode (newDoc.documentElement, true),
document.documentElement
);
这里我将样式表存储在 xsl_str
变量中。对于更复杂的操作,您可能会发现 fetch the stylesheet via a @resource
directive.
安装该脚本,然后访问 your example XML。
您将看到它转换该文档...