向XSLT样式表添加Xinclude支持

向XSLT样式表添加Xinclude支持,xslt,xinclude,Xslt,Xinclude,我有一个将XML格式转换为HTML的大型XSLT样式表。我想在输入XML文件中添加对XInclude的支持。目标是每个include文件以及include XML文件都可以独立地进行XSD验证。我已经控制了XML模式中的所有更改(我认为);只有特定的XML元素可以移出以包含文件,并且只有一个级别的包含文件嵌套。在Eclipse的XML编辑器中,它可以很好地验证包含文件和每个包含文件 XSLT样式表有两种使用方式,这里我们更接近我的问题: 在构建环境中,使用使用lxml进行XSLT转换的Pytho

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

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

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

  • 在包含XML文件的xsl样式表指令中。这种情况下,人们希望在Web浏览器中立即看到他们在任何XML文件中所做的更改。到目前为止,这已经证明是一个非常有效的环境,所以我不想失去它

  • 我能够得到用例1。在Python脚本中使用ElementTree.xinclude()方法。然而,这并不是用例2的解决方案

    此外,我确实了解如何编写只执行Xinclude解析的XSLT样式表,理论上这可以用作第一次转换,然后是用于XML到HTML转换的现有XSLT样式表。问题是XML文件只能有一条xsl样式表指令

    另一个想法是将XInclude解析留给Web浏览器。然而,我不知道有任何网络浏览器支持这一点。此外,我不希望只使用一个特定的浏览器。到目前为止,我们支持所有最常见的浏览器

    另一个想法是将XInclude解析支持添加到现有XSLT样式表中。然而,在这里,我正在努力研究什么是输入,什么是输出,因为这实际上是三个阶段(XML输入如文件->平面XML和Xinclude解析->HTML中所示。Xinclude解析部分将需要执行第一次转换,而现有XSLT代码将执行第二次转换。我不确定在一个样式表中是否可以实现这一点

    我的问题是:

  • 在使用Web浏览器打开(包括)XML文件时,有没有办法调用两个XSLT样式表

  • 是否有任何方法可以通过XInclude支持改进现有的XSLT样式表,使其保持为单个样式表

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

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

  • 谢谢
    Andy

    要做到这一点,您可能应该看看XProc

    您的用例似乎太复杂了,无法在单个XSLT中完成

    有没有什么方法可以让我在调用时调用两个XSLT样式表 是否使用Web浏览器打开(包括)XML文件

    有什么方法可以改进现有的XSLT样式表吗 XInclude支持使其保持为单个样式表

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

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

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

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

    (3) 我不知道“修改输入”是什么意思:XSLT转换 (或修改)将输入转换为输出。除非您要求:可以 在一个步骤中修改输入,然后再次转换输出 再次?是:如果浏览器支持exslt:节点集,则您可以 使用一次转换的结果创建一个变量,然后选择 该变量用于另一个转换。您可以使用模式选择 不同步骤的不同模板集

    比如:

     <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) 我不知道您现有的样式表是什么样子的,但是可能:是的。 当你认为它必然是两个分开的时候,你是在按程序思考 执行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>
    
    
    
    :在文档后添加“/*”(@href) 避免在包含的文档和基础上再次调用根模板 文件

    然后包括一个match=“/”模板来设置外部html,以及 转换模式以创建内部节点

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

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

    需要考虑的几点:

    我不知道浏览器会做什么,如果一次转换的结果是,你用不同的指令生成另一个文件。它会继续吗?可能值得一试。如果不会,你可以用javascript显式地进行处理,然后应用第二次转换

    浏览器中支持xslt、javascript和css:您可以将javascript和css注入到输出中