【问题标题】:Two XSL files need single final output file两个 XSL 文件需要一个最终输出文件
【发布时间】:2021-06-22 11:55:29
【问题描述】:

我有一个输入文件和两个 XSL 文件 test1.xsl、test2.xsl

  1. test1.xsl 文件对输入文件进行转换并生成 test1-output.xml
  2. test2.xsl 文件在 test1-output.xml 上转换并生成最终输出

要求:

我正在使用 XSLT 2.0 我想同时运行两个 xslt 文件在输入文件上转换并生成最终输出。 这个需求怎么做,请指教!

输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<k>
    <page>content here</page>
    <page1>content here</page1>
</k>

test1.xsl 文件:

<?xml version="1.0"qqq encoding="UTF-8"?>
<xsl:stylesheet xmqlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="@*| node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
<xsl:template match="page">
        <page>
            <kita>
                <xsl:apply-templates/>
            </kita>
        </page>
    </xsl:template>
</xsl:stylesheet>

test1.xsl 的输出

<?xml version="1.0" encoding="UTF-8"?>
<k>
    <page>
      <kita>content here</kita>
   </page>
    <page1>content here</page1>
</k>

test2.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="@*| node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="kita">
        <kita>
            <kita1>
                <xsl:apply-templates/>
            </kita1>
        </kita>
    </xsl:template>
</xsl:stylesheet>

这是我从第二个 XSLT 文件中的最终 xml 输出:

<?xml version="1.0" encoding="UTF-8"?>
<k>
    <page>
      <kita>
         <kita1>content here</kita1>
      </kita>
   </page>
    <page1>content here</page1>
</k>

提前致谢

【问题讨论】:

  • 想知道如何启动 xsl?您使用的是什么 xslt 处理器。顺便说一句,您的 2 次转换只需使用 1 个 xslt 和一个额外的模式即可完成。
  • 嗨@sibe:我知道我们可以在这个例子中使用单个xslt。但我想知道如何做到以上要求。请建议
  • 好的,但是您使用的是哪个 xslt 处理器?
  • 在什么平台上,使用什么语言?
  • XSLT 3 中可用的 XPath 3 有一个 transform 函数,如果您有 XSLT 3 处理器,如 Saxon 9.8 或更高版本、Saxon-JS 2 或 AltovaXML 2017 R3 及更高版本,则可以使用该函数。基于 XSLT 2 处理器的通用解决方案可能需要研究诸如 XProc 之类的宿主语言,当然还有 Java 或 C# 或 shell 脚本。

标签: xslt-2.0


【解决方案1】:

在 XSLT 3 中,您可以编写一个样式表,其中有两个参数调用 fn:transform 两次,例如

<xsl:param name="xslt1" as="document-node()"/>
<xsl:param name="xslt2" as="document-node()"/>

<xsl:template match="/">
  <xsl:sequence
    select="
    transform(map {
      'stylesheet-node' : $xslt1,
      'source-node' : .
    })?output ! transform(map {
      'stylesheet-node' : $xslt2,
      'source-node' : .
    })?output"/>
</xsl:template>

或者如果你想传入文件 URIs

<xsl:param name="xslt1" as="xs:string">test1.xsl</xsl:param>
<xsl:param name="xslt2" as="xs:string">test2.xsl</xsl:param>

<xsl:template match="/">
  <xsl:sequence
    select="
    transform(map {
      'stylesheet-node' : doc($xslt1),
      'source-node' : .
    })?output ! transform(map {
      'stylesheet-node' : doc($xslt2),
      'source-node' : .
    })?output"/>
</xsl:template>

【讨论】:

  • 谢谢@martin,但我使用的是xslt 2.0,那么如何在xslt 2.0中做
  • Sibe:我没有使用任何语言,我只是在使用氧气编辑器将一个文档转换为另一个文档
  • @KitaAnsari,我只发布了 XSLT 版本,因为新引入的 fn:transform 函数允许您从 XSLT 中运行 XSLT,因此您需要迁移到 XSLT 3 或者您需要查看处理器特定的扩展,或者如评论中所说,在 XSLT 之外查看 XProc、Java、C# 或任何允许您链接 XSLT 转换的宿主语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多