合并包含xsl:include和xsl:import的多个XSLT样式表

3

我有一个 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 合并到主文件中。这样,我就可以看看是否解决了问题。我已经阅读了其他线程提供的解决方案,例如:递归合并多个XSLT样式表。我可以看到,所提供的解决方案在服务器端使用这个样式表脚本:
<?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开发,因为在浏览器中运行是最痛苦的开发环境之一。 - Michael Kay
我的主要问题是如何合并XSL文件。我想知道如何实现服务器端的合并。没有人提供关于如何以及在哪里放置的任何信息。 - JohnJackson
你想按需求执行它,每次使用样式表时都要执行,还是想在构建网站时执行一次?所用的技术是什么:Java、.NET等?有很多方法可以做到这一点,而且它们都很容易,所以很难看出你的困难在哪里。 - Michael Kay
我正在尝试将template.xsl中的所有包含/导入合并到template.xsl中,以创建一个单一文件,供webkit浏览器使用。我只想执行这个任务一次,只需要合并后的文件。我猜我无法理解的是如何完成合并操作。我需要任何能帮助我完成此任务的工具或技术,因为我不想手动完成这个任务。我将在下面的帖子中进行更详细的解释。 - JohnJackson
1个回答

2
我同意Michael的评论,即这个问题实际上太宽泛了,但是从你的问题中我所理解的是,你想让你的样式表在浏览器上工作,而某些浏览器不允许使用或。
如果你没有XSLT开发环境,我强烈建议你获取一个,就像Michael已经说过的那样,有很多选择。这将为你节省很多痛苦。建议包括:oXygen(在我不太谦虚的意见中,是最好的),Visual Studio(只支持XSLT 1.0,但对于您的任务足够,因为浏览器只支持XSLT 1.0),Stylus StudioEclipse

尽管如此,我不知道如何使用它(除了用xsl:include替换我的xsl:import)。

你可以像使用任何XSLT一样使用它,但在这种情况下,需要合并的XSLT是源文件,需要使用上面展示的XSLT进行转换。只需使用您 喜欢的处理器 从命令行运行即可。

是的,您可以在样式表中替换 xsl:import,但请注意导入和包含不同。您可能需要手动调整 导入优先级,因为将这些样式表插入现场后会丢失优先级。

我把它放在我的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个xsl应用于template.xsl后的输出文件?对于我缺乏XSL知识表示抱歉。 - JohnJackson
我想我明白你想告诉我的了。我可以使用一个命令行XSL工具,将我的模板作为源文件,将合并的XSL作为XSL,同时获得输出。我没有想到我可以使用XSL作为源文件而不是XML,这让我有些困惑。你是想告诉我这个吗? - JohnJackson
是的,这正是我想说的。认识到XSLT XML(反之则不然)非常重要,请点击链接并阅读前三节内容,它将改变你的世界;同样重要的是认识到XSLT是一个图灵完备的编程语言,可以使用通常称为_XSLT处理器_的工具进行编译或解释。文本中的链接指向其中的一些工具。 - Abel
还要注意:对于您的任务,您选择哪个处理器并不重要,但是为了避免很多麻烦,建议您直接下载oXygen或类似软件(链接在文本中),这样您就可以轻松地通过单击按钮进行任何转换 - Abel
谢谢你的解释,Abel。我没有想到XSL本身可以像XML一样被视为其他XSL的源。这很有趣。我一定会尝试使用oXygen。还要感谢Michael Kay。 - JohnJackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接