Xslt xlst:从基本xml到中间xml再到最终输出

Xslt xlst:从基本xml到中间xml再到最终输出,xslt,pipeline,Xslt,Pipeline,这是我先前问题的后续行动 我将尝试用一个通用术语来表达它,因为我认为这将使我能够更好地理解XSLT:什么以及如何使用适当的XSLT IDOM来使用它 这就是我想要的: 输入XML->中间XML->…->最终转变 或者换句话说:我如何在一个XSLT文档中管道化各种XML转换 我的命令行类比是有多个命令行工具来执行部分解决方案,然后让它们使用管道按顺序执行 在这种情况下: 输入XML(带元素)->中间XML(带单独的和元素)->按排序的最终XML 我仅限于一个XSLT文档,因为手头的web工具甚至不

这是我先前问题的后续行动

我将尝试用一个通用术语来表达它,因为我认为这将使我能够更好地理解XSLT:什么以及如何使用适当的XSLT IDOM来使用它

这就是我想要的:

输入XML->中间XML->…->最终转变

或者换句话说:我如何在一个XSLT文档中管道化各种XML转换

我的命令行类比是有多个命令行工具来执行部分解决方案,然后让它们使用管道按顺序执行

在这种情况下:

输入XML(带元素)->中间XML(带单独的和元素)->按排序的最终XML


我仅限于一个XSLT文档,因为手头的web工具甚至不允许
xsl:include
xsl:import
成功

人们容易想到的三种方法是:

  • 使用操作系统管道:

    xsltproc ss1.xsl input.xml \\
      | xsltproc ss2.xsl - \\
      | xsltproc ss3.xsl - \\
      > output.xml
    
    我在这里知道的主要缺点是,并非所有处理器都有命令行接口,可以轻松读取stdin上的主输入树。所以当我这样做的时候,我有时会写临时文件;幸运的是,磁盘空间很便宜。好处:你可能已经知道怎么做了

  • 使用XProc管道

    主要缺点:你必须学习一项新技术。主要好处:你可以学习一项新技术,这实际上很酷

  • 为不同的操作定义不同的模式,并使用XSLT 2.0(或具有某种形式的节点集扩展的XSLT 1.0处理器)处理数据:

    <xsl:template match="/">
      <xsl:variable name="tree1">
        <xsl:apply-templates mode="mode1"/>
      </xsl:variable>
      <xsl:variable name="tree2">
        <xsl:apply-templates mode="mode2" select="$tree1"/>
      </xsl:variable>
      <xsl:apply-templates mode="mode3" select="$tree2"/>
    </xsl:template>
    
    
    
    优点:所有这些都在一个样式表中,所以当您在六个月后再次使用它时,您永远不必费解如何运行该流程。(你的问题的措辞表明这是你真正想要的答案。)缺点:它都在一个样式表中,所以你必须更加努力地实现模块化和关注点分离


毫无疑问,还有其他方法。

也许我误解了这个问题。但是,您可以随意调用xslt命令行工具,并将输出从一个步骤传递到下一个步骤。例如,
xsltproc 1.xlt 1.xml | xsltproc 2.xsl-
。但我更喜欢tmp文件。我希望我能在这里这样做。我使用的工具甚至不允许包含其他xsl文件。考虑到它需要全部都放在一个样式表中,这个XSLT引擎是否允许libxslt“node-set()扩展名”?供应商:libxslt,版本:1.0Try
xsltproc--dumpextensions | grep节点集
查看。当然,您也可以在样式表中使用function-available(),这是因为xsltproc不在命令行中。它集成在icecast服务器中,我不知道他们使用的是哪个版本。我要问一个新问题。我甚至设法回答了这个新问题(: