2013-02-27 56 views
2

我有一个将XML格式转换为HTML的大型XSLT样式表。我想在输入XML文件中添加对XInclude的支持。目标是每个包含文件都可以独立进行XSD验证,以及包含XML文件。我对XML模式中的所有变化进行了控制(我认为);只有特定的XML元素可以移出来包含文件,并且只有一个级别的包含文件嵌套。我已经在Eclipse的XML编辑器中工作了,它很好地验证了包含文件和每个包含文件。将Xinclude支持添加到XSLT样式表中

XSLT样式表是用在两个方面,这里我们更接近我的问题:

  1. 在通过使用LXML为XSLT转换Python脚本的建设环境。 Python脚本集成到基于构建的构建环境中,并集成到Eclipse的Ant脚本中。

  2. 在包含XML文件的xsl-stylesheet指令中。这是针对人们希望立即在Web浏览器中看到他们在任何XML文件中所做的更改的情况。迄今为止,这已证明是一个非常有效的环境,所以我不想放弃这一点。

我能够得到用例1.通过使用Python脚本中的ElementTree.xinclude()方法工作。但是,对于用例2来说,这并不是解决方案。

另外,我的确了解如何编写仅执行Xinclude解析的XSLT样式表,并且这在理论上可以用作第一个转换,然后是现有的XSLT XML到HTML转换的样式表。问题是XML文件只能有一个xsl-stylesheet指令。

另一个想法是将XInclude分辨率保留到Web浏览器。但是,我不知道任何支持该功能的Web浏览器。此外,我讨厌限制使用一个特定的浏览器。到目前为止,我们支持所有最常见的浏览器。

另一个想法是将XInclude解析支持添加到现有的XSLT样式表中。但是,我在输入什么和输出是什么,因为这些实际上是三个阶段(XML输入就像文件 - > FLAT XML,Xinclude已解决 - > HTML。XInclude解析部分需要执行第一个转换。与现有的XSLT代码将执行第二我不知道这是可能的一个样式表

我的问题是:

  1. 有什么办法,我怎么可以得到两个XSLT样式表调用时用网络浏览器打开(含)XML文件?

  2. 有没有什么办法可以改进使用XInclude支持现有的XSLT样式表,以便它保持单个样式表?

  3. 在XSLT样式表中是否有任何方法来修改输入?

  4. Web浏览器在XInclude解决方案中提供任何支持吗?

感谢 安迪

回答

0

你或许应该看看XPROC做

看来你的使用情况太令人费解以单XSLT来完成

2

1有什么办法可以在 用Web浏览器打开(包括)XML文件时调用两个XSLT样式表?

2有什么办法可以改进现有的XSLT样式表和 XInclude支持,以便它仍然是一个样式表?

[3]在XSLT样式表中有没有办法修改输入?

[4] Web浏览器在XInclude解决方案中提供任何支持吗?

应对以相反的顺序问题,因为它更容易这样:

(4)我还没有看到任何的Web浏览器做的XInclude扩展。 (3)我不知道“修改输入”是什么意思:XSLT将输入转换为(或修改)输入到输出中。除非你问:可以 你在一个步骤中修改输入,然后再次转换输出 ?是的:如果浏览器支持exslt:node-set,那么您可以使用 创建一个带有一个变换结果的变量,然后选择 该变量用于其他变换。您可以使用模式为不同步骤选择 一组不同的模板。

是这样的:

<xsl:variable name="doc.all"> 
    <xsl:apply-templates mode="p1" select="/" /> 
</xsl:variable> 

用的模式= “P1” 模板的集合,以及某处 模板选择该变量作为一个节点集:

<xsl:template match="/" > 
    <xsl:apply-templates select="exslt:node-set($doc.all)" /> 
    </xsl:template> 

[XSLT -2.0可以更直接地处理节点集,但是没有浏览器本地支持XSLT-2.0 heets看起来像,但可能:是的。 当你想到它必然是两个单独的 步骤来执行XInclude处理和xslt的其余部分时,您正在程序思考。如果您正在执行使用XSLT进行XInclude扩展,则xinclude只是另一组匹配的模式。

你可能想是这样的模板做的XInclude扩展:

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)]"> 
     <xsl:apply-templates select="document(@href)/*" /> 
    </xsl:template> 

modified from the answer to this question:添加了“/ *”后的文件(@href) 以避免再次调用根模板所包含的文件以及基地 文件。

然后包含一个匹配=“/”模板来设置外部html,其余的转换模式创建内部节点。

这两个步骤隐含在这里:第一步是将输入源重定向到 xi:include/@ href,当它遇到该元素时。步骤是根据其他匹配模板处理该文档中的节点 。 (1)您只能使用PI运行一个样式表,但是,您在浏览器中使用了Javascript,因此只要您避免了跨域安全问题,您就应该可以在程序上做到这一点。

几点考虑:

我不知道什么是浏览器做,如果作为一个变换的结果,你产生了不同的指令另一个文件。它会继续吗?值得尝试。如果没有,您可以明确地在JavaScript中进行处理,然后应用第二个转换。

您在浏览器中有xslt,javascript和css支持:您可以将javascript和css注入到输出中。和CSS可以风格的XML以及HTML。

Michael Kay已发布Saxon CE,这是一个编译为javascript的XSLT 2.0实现,以便它可以在浏览器中运行。