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

时间:2015-08-20 04:17:39

标签: php xml xslt merge

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

1 个答案:

答案 0 :(得分:0)

我同意迈克尔的评论,这个问题实际上过于宽泛,但我从您的问题中读到的是,您希望样式表适用于浏览器,某些浏览器不允许xsl:importxsl:include

如果你没有XSLT开发环境,我强烈建议你自己一个,就像迈克尔已经说过的那样,很多都存在。它会为你节省很多痛苦。建议包括:oXygen(我不是那么谦虚,最好的),Visual Studio(只有XSLT 1.0,但是因为浏览器只支持XSLT 1.0,所以你的任务就足够了),Stylus Studio,{ {3}}

  

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

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

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

  

我可以将它放在我的template.xsl文件中吗?

我不明白这个问题。你说你想用原来的XSLT替换那个有导入和包含插入的XSLT,所以我猜你最好知道这个答案,但我想你想要在原始样式表上替换输出。

  

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

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

  

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

是的,请参阅上文,只需运行您已提供的样式表并确保输出安全。

  

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

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

所有这一切的底线是,在我看来你正在努力实现某些目标,但你还不知道你想要实现的是什么。我的建议是尝试使用XSLT(肯定不在浏览器中!)并且一旦理解了这些概念,尝试自己建议的场景:对原始版本运行merge-stylesheet样式表。

当然,这要经历很多麻烦,特别是考虑到xsl:import与仅包含该地方样式表的内容不同。您最好通过手动复制项目,使用XSLT编辑器显示出现错误,修复它们,保存它们,发布它。