【问题标题】:Merging multiple XSLT stylesheets containing xsl:include and xsl:import合并多个包含 xsl:include 和 xsl:import 的 XSLT 样式表
【发布时间】:2015-08-20 04:17:38
【问题描述】:

我有一个 XSL 文件 (template.xsl),如下所示:

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

<xsl:import href="1.xsl" />
<xsl:import href="2.xsl" />
<xsl:import href="3.xsl"/>
<xsl:import href="4.xsl"/>

...

该文件在我测试过的所有非 webkit 浏览器上都可以正常工作。不过,我希望它也可以在 webkit 浏览器上运行。所以,我需要一种将所有 xsl:import 合并到主文件中的方法。所以,我可以看看这是否能解决问题。我已经阅读了其他线程上提供的解决方案,例如这个:

Recursively merging multiple XSLT stylesheets

我可以看到提供的解决方案使用了这个样式表脚本服务器端:

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

 <xsl:template match="xsl:include">
<xsl:apply-templates select="document(@href)/xsl:stylesheet/*"/>
 </xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

不过,我不知道如何使用它(除了将我的 xsl:import 替换为 xsl:include 之外)。我将它放在我的 template.xsl 文件中吗?我是否将它放在一个新的 XSL 文件中并使用 php 脚本来加载它,以便合并 XSL 文件。如果我能举个例子就好了。我需要的结果是为浏览器提供一个没有包含/导入的 XSLT。我想要一个可以在合并后保存的 XSL 文件,所以我摆脱了其他文件。除非必须,否则我不想合并文件服务器端。所以,如果有一个工具可以合并文件。那也可以。谢谢。

【问题讨论】:

  • 您只是在问“我如何运行 XSLT 样式表服务器端?”有许多处理器可以做到这一点,或者使用命令行或 GUI 界面,或者集成到 IDE 中,或者托管在 Web 上。我很惊讶任何人都应该在不经常使用这样的工具的情况下进行 XSLT 开发,因为在浏览器中运行是可以想象的最痛苦的开发环境。
  • 我的主要问题是如何合并 XSL 文件。我想知道如何实现该服务器端合并。没有人提供有关如何以及在何处放置的任何信息。
  • 您是希望在每次使用样式表时按需执行,还是希望在构建站点时执行一次?什么是技术:Java、.NET 等?有很多方法可以做到,而且都很容易,所以很难看出你的困难在哪里。
  • 我正在尝试将 template.xsl 中的所有包含/导入合并到 template.xsl 中,以创建将呈现给 webkit 浏览器的单个文件。我想做一次这个任务。我只想要合并的文件。我想我无法理解的是如何完成合并。我需要任何可以帮助我做到这一点的工具或技术,因为我不想手工完成。我将在下面的帖子中进行更多解释。

标签: php xml xslt merge


【解决方案1】:

我同意 Michael 的 cmets 的观点,即这个问题实际上过于宽泛,但我从你的问题中了解到,你希望你的样式表在浏览器上工作,并且某些浏览器不允许 xsl:importxsl:include

如果您没有 XSLT 开发环境,我强烈建议您自己购买一个,正如 Michael 已经说过的那样,存在很多。它会为自己省去很多痛苦。建议包括:oXygen(在我看来,最好的)、Visual Studio(仅 XSLT 1.0,但由于浏览器仅支持 XSLT 1.0 足以满足您的任务)、Stylus StudioEclipse

不过,我不知道如何使用它(除了将我的 xsl:import 替换为 xsl:include 之外)。

您可以将它与任何 XSLT 一起使用,但在这种情况下,您需要合并的 XSLT 是源,要使用上面显示的 XSLT 进行转换。只需使用您的 favorite processor 从命令行运行它。

是的,您可以替换该样式表中的xsl:import,但请注意导入与包含不同。之后您可能需要手动调整import precedence,在您将这些样式表插入原位后,该import precedence 会丢失。

我是否将它放在我的 template.xsl 文件中以及放在哪里?

我不明白这个问题。你说你想用插入了导入和包含的 XSLT 替换原来的 XSLT,所以我猜你最了解这个答案,但我假设你想用原来的样式表替换输出。

我是否将它放在一个新的 XSL 文件中并使用 php 脚本来加载它,以便合并 XSL 文件。

我不知道 PHP 在哪里以及如何出现。你说你想在浏览器中加载它。因此,转换的结果应该在本地测试后,可供浏览器访问。

我想要一个可以在合并后保存的 XSL 文件,因此我删除了其他文件。除非必须,否则我不想合并文件服务器端。

是的,见上文,只需运行您已经提供的样式表并保护输出。

除非必须,否则不想在服务器端合并文件。所以,如果有一个工具可以合并文件。

你自己已经给了一个工具。您可以将它与任何 XSLT 文件一起使用,只需从命令行运行它(每个处理器的参数不同,但通常您可以通过使用 -? 或 '-h' 作为参数来查看它们,或者只查看处理器的文档)。


所有这一切的底线是,在我看来,您正在努力实现某些目标,但您还不知道您要实现的目标是什么。我的建议是使用 XSLT 进行一些试验(绝对不在浏览器中!),一旦你理解了这些概念,试着做你已经建议自己的场景:对你的原始文件运行合并样式表样式表。

当然,这很麻烦,尤其是考虑到xsl:import 与仅在该位置包含样式表的内容不同。您最好手动复制项目,使用 XSLT 编辑器显示出现的错误、修复它们、保存、发布。

【讨论】:

  • 我想要完成的是将 1.xsl、2.xsl、3.xsl、4.xsl 合并到模板 xsl(原始文件)中。我想要一个合并的文件。虽然,我不知道如何完成它。我一直在寻找解决方案,并且遇到了上面的合并样式表。让我重新表述我的问题。如何在我的 template.xsl 上应用合并样式表?例如,是否有一个命令可以执行如下操作。运行 merge.xsl template.xsl output.xsl。其中 output.xsl 是合并样式表后将所有 1,2,3,4 xsls 应用到 template.xsl 后的输出文件?对不起,我缺乏 XSL 知识。
  • 我想我明白了你想告诉我的。我可以使用命令行 XSL 工具,源是我的模板,XSL 是合并 xsl,同时获得输出。我不认为我可以使用 XSL 作为源而不是 XML,这就是让我大吃一惊的原因。你是想告诉我的吗?
  • 是的。这正是我想说的。意识到XSLT is XML 非常重要(反之则不然),点击该链接并阅读前三部分,它会改变你的世界;)。同样重要的是要认识到 XSLT 是一种图灵完备的编程语言,可以使用通常称为 XSLT 处理器的东西进行编译或解释。文本中的链接将您指向其中的几个。
  • 另请注意:对于您的任务,您选择哪种处理器并不重要,但可以避免很多麻烦,只需下载 oXygen 或类似的(文本链接),所以 你可以通过单击按钮进行任何转换
  • 感谢您的解释,阿贝尔。我不认为 XSL 本身可以像 XML 一样被视为其他 XSL 的源。这太有趣了。我一定会试试那个氧气。另外,感谢 Michael Kay。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2011-08-24
  • 2011-03-23
  • 2014-08-25
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多