将Xinclude支持添加到XSLT样式表

时间:2013-02-27 14:08:23

标签: xslt xinclude

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

XSLT样式表有两种使用方式,在这里我们更接近我的问题:

  1. 在构建环境中,Python脚本使用lxml进行XSLT转换。 Python脚本集成到基于make的构建环境和Eclipse的Ant脚本中。

  2. 在包含XML文件的xsl-stylesheet指令中。这适用于人们希望在Web浏览器中立即查看他们在任何XML文件中所做的更改的情况。到目前为止,这已被证明是一个非常有效的环境,所以我不想放松它。

  3. 我能够通过Python脚本中的ElementTree.xinclude()方法获得用例1。但是,这不是用例2的解决方案。

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

    另一个想法是将XInclude解析保留在Web浏览器中。但是,我不知道任何支持它的Web浏览器。此外,我不想限制只使用一个特定的浏览器。到目前为止,我们支持所有最常见的浏览器。

    另一个想法是将XInclude解析支持添加到现有的XSLT样式表中。但是,我正在努力解决输入和输出的问题,因为这些实际上是三个阶段(文件中的XML输入 - >带有Xinclude解析的FLat XML - > HTML。XInclude解析部分需要执行第一次转换和现有的XSLT代码将执行第二次。我不确定在一个样式表中是否可行。

    我的问题是:

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

    2. 有什么方法可以改进现有的XSLT样式表并使用XInclude支持,以便它仍然是一个样式表吗?

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

    4. Web浏览器是否在XInclude解析中提供任何支持?

    5. 由于 安迪

2 个答案:

答案 0 :(得分:2)

  

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

     

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

     

[3] XSLT样式表中是否有任何方法可以修改输入?

     

[4] Web浏览器是否在XInclude解析中提供任何支持?

以相反的顺序处理问题,因为这样更容易:

(4)我还没有看到任何进行XInclude扩展的Web浏览器。

(3)我不知道你的意思是“修改输入”:XSLT转换    (或修改)输入到输出。除非你问:可以  您在一步中修改输入,然后再次转换输出  又一次?是的:如果浏览器支持exslt:node-set,那么你可以  使用一个转换的结果创建一个变量,然后选择  另一个变换的变量。您可以使用模式进行选择  不同步骤的不同模板集。

类似的东西:

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

带有一系列mode =“p1”模板,以及某个地方 选择该变量作为节点集的模板:

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

[XSLT-2.0可以更直接地处理节点集,但是没有浏览器   原生支持XSLT-2.0]

(2)我不知道您现有的样式表是什么样的,但可能是:YES。  当你想到它必然是两个独立的时候,你在程序上思考  执行XInclude处理和xslt其余部分的步骤。如果你在做  XInclude使用XSLT进行扩展,然后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)  避免在包含的文档和基础上再次调用根模板 文献。

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

这里隐含两个步骤:第一步是将输入源重定向到    xi:include / @ href遇到该元素时。步骤是处理节点    在该文档中根据其他匹配模板。

(1)您只能使用PI运行一个样式表,但是,您有 浏览器中的Javascript,只要您避免跨域安全问题,就应该 能够在程序上做事。

需要考虑的一些要点:

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

您在浏览器中拥有xslt,javascript和css支持:您可以将javascript和css注入输出。而css可以设置XML和HTML的样式。

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

答案 1 :(得分:0)

你应该看看XProc来做那件事

看来你的用例太麻烦了,不能在单个XSLT中完成