【发布时间】:2021-06-22 11:55:29
【问题描述】:
我有一个输入文件和两个 XSL 文件 test1.xsl、test2.xsl
- test1.xsl 文件对输入文件进行转换并生成 test1-output.xml
- 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