3

这是对我之前的问题xslt split mp3 tag into artist 和 title的跟进

我将尝试用通用术语来表述它,因为我认为它可以让我更好地理解 XSLT:什么以及如何使用适当的 XSLT 惯用语来使用它。

这就是我要的:

输入 XML -> 中间 XML -> ... -> 最终转换

或者换句话说:如何在一个 XSLT 文档中流水线化各种 XML 转换?

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

在这种特定情况下:

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

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

4

1 回答 1

4

很容易想到的三种方法是:

  • 使用操作系统管道:

    xsltproc ss1.xsl input.xml \\
      | xsltproc ss2.xsl - \\
      | xsltproc ss3.xsl - \\
      > output.xml
    

    我在这里知道的主要缺点是并非所有处理器都具有命令行界面,可以轻松读取标准输入上的主输入树。所以当我这样做的时候,我有时会写临时文件;幸运的是,磁盘空间很便宜。好处:您可能已经知道如何做到这一点。

  • 使用 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>
    

    好处:这一切都在一个样式表中,因此当您在六个月后返回它时,您永远不必困惑如何运行该过程。(你的问题的措辞表明这是你真正想要的答案。) 缺点:它都在一个样式表中,所以你必须更加努力地实现模块化和关注点分离。

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

于 2013-06-23T15:29:12.467 回答