gpt4 book ai didi

javascript - 使用多个 XSL 文件转换 XML

转载 作者:可可西里 更新时间:2023-11-01 01:26:14 27 4
gpt4 key购买 nike

我有一些 XML,我想使用一些 XSL 文件将其转换为 HTML。这些 XSL 文件都通过 xsl:import 和 xsl:include 语句关联起来,并且都是完成转换所必需的。

我知道 XSL 有效,因为使用 <?xml-stylesheet type="text/xsl" href="transform.xsl"?>浏览器打开的预先创建的 XML 文件中的指令显示我想要的输出。问题是我希望能够在动态生成的 XML 上复制此功能。

我认为有两种方法可以做到这一点,但这两种方法似乎都有我无法解决的局限性。

第一个解决方案是使用 Javascript 来转换 XML。据我所知,这将需要 XSLTProcessor 对象加载多个 XSL 文件,但 Chrome(可能还有其他浏览器)不能很好地支持 xsl:import - http://code.google.com/p/chromium/issues/detail?id=8441

我还查看了将 XML 写入 iFrame 或新窗口,但是 <?xml-stylesheet type="text/xsl" href="transform.xsl"?>指令在结果窗口中被注释掉。实际上,任何写入新窗口的内容都是 HTML - 我还没有找到将 XML 写入新窗口的方法。

那么如何才能让浏览器窗口显示一个 XML 文件用一组 XSL 文件转换后的结果呢?

更新

下面是我对这个问题的研究结果。

可能的解决方法:使用 emscripten 将 xsltproc 之类的工具编译成 JavaScript。我实际上已经这样做了 - 请参阅 https://github.com/mcasperson/xsltproc.js

问题:它在 firefox 中非常慢(在 Chrome 中需要 5 秒,在 firefox 中需要 30 秒以上),并且您无法在 Chrome Web Worker 中运行代码 - https://code.google.com/p/chromium/issues/detail?id=252492

可能的解决方法:根本不使用 XSL,而是使用 CSS 样式表显示 XML。

问题:直到浏览器开始实现 css attr(atrributename, url)函数,无法将 XML 属性中的文件引用视为字符串以外的任何内容,这使得无法显示图像。

可能的解决方法:将所有 XSL 文件合并到一个样式表中

问题:这在某种程度上是可能的(参见 Merge multiple xslt stylesheets ),但是 xsl:import 和 xsl:include 具有特定的语义,当简单地用文件内容代替xsl:import 或 xsl:include 语句。对于分解为多个文件的大型 XSL 转换,此解决方案需要大量手动工作。

可能的解决方法:将 XML 的内容写到 iframe 或新窗口中。

问题:无法将 XML 写入新窗口或 iframe。写入这些元素的内容总是假定为 HTML,并插入到 HTML->BODY 元素中。

可能的解决方法:创建接受 XML 的服务器端服务,然后使用 XSL 样式表指令返回该 XML。服务 URL 然后可以用作 src iframe 或新窗口的属性。

问题:服务必须是 GET 端点,这意味着要返回的 XML 必须作为查询参数包含在内,这意味着您最终会遇到问题URL 的长度。

可能的解决方法:使用类似 Saxonica CE 的 javascript XSL 库.

问题:这可能确实有效(我还没有尝试过),但 Saxonica CE 不是开源的(这是我们项目的要求)。

最佳答案

如果你想要一个仅浏览器的解决方案,我会这样做:

静态xml

制作一个简单的静态 xml,其中只包含对 xsl 的调用。这是在浏览器中打开的 xml - 总是。此 xml 文件可以包含用于控制流的属性设置,也可以不包含此示例中的任何内容。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="cartoon2html.xsl"?>
<xml/>

动态纯 xml

使用定义的名称以您喜欢的方式生成动态 XML - 在我的例子中是 cartoons.xml。

<?xml version="1.0" encoding="utf-8"?>
<cartoons>
<cartoon name="Donald Duck" publisher="Walt Disney" />
<cartoon name="Mickey Mouse" publisher="Walt Disney" />
<cartoon name="Batman" publisher="DC Comics" />
<cartoon name="Superman" publisher="DC Comics" />
<cartoon name="Iron Man" publisher="Marvel Comics" />
<cartoon name="Spider-Man" publisher="Marvel Comics" />
</cartoons>

带文档加载的 XSLT

在xslt中使用document loan来引用生成的动态xml。通过在第一个应用模板中使用 select,所有其他模板将按预期工作。

仔细查看代码顶部和下方的变量引用。这就是施展魔法的地方。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="cartoons" select="document('cartoons.xml')/cartoons" />

<xsl:template match="/">
<html>
<head>
<title>Cartoons</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<xsl:apply-templates select="$cartoons" />
</body>
</html>
</xsl:template>

<xsl:template match="cartoons">
<table>
<xsl:apply-templates />
</table>
</xsl:template>

<xsl:template match="cartoon">
<tr>
<td><xsl:value-of select="@name" /></td>
<td><xsl:value-of select="@publisher" /></td>
</tr>
</xsl:template>

</xsl:stylesheet>

您可以将这三个文件保存到选择的目录中,然后在 firefox 中打开静态 xml 文件。 (Chrome 和 Safari 可能必须通过网络服务器提供文件才能执行转换)。

关于javascript - 使用多个 XSL 文件转换 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13467069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com