【发布时间】:2023-03-09 05:21:01
【问题描述】:
首先,我应该说我是 XSLT 方面的初学者。
虽然确切的上下文可能不那么相关(并且可能过于混乱),但我将在下面提供。 我有一个链式转换,如下所示:
-
Input.xml是此转换的输入文件,使用transform.xsl执行。这个转换的结果是output.xml。transform.xml包含一个经典的自定义xsl:function:xsl:function name="my:f" xsl:sequence select=".. xpath .." xsl:function 第 1 步的结果 (
output.xml) 是第 2 步的新转换器 (transform2.xsl),它将使用其他一些 XML 输入(比如input2.xml)。
我想要做的是将xsl:function 节点完全复制(在步骤1中的transform.xsl中)到output.xml,以便它可以在步骤中使用2.
在这种情况下,xsl:function 在复制时不需要更新/更改(只是一个简单的节点副本)。
请注意,我不想仅在存在给定输入元素(来自input.xml)时复制xsl:function。但是,无论input.xml 是什么,我都想一直复制它。
现在我知道这可以通过创建一个包含我的xsl:function 的单独文件来实现,然后使用xsl:import 从两个转换中包含此文件(transform.xml 和transform2.xml)。
但我想知道是否还有其他方法可以实现这一点(..没有声明/定义函数的单独文件)?
提前致谢,
M.
【问题讨论】:
-
@user414366:不清楚为什么要动态构建 XSLT 2.0。如果您无法更改第一个样式表以隔离通用样式表模块中的函数声明,您可以将第一个样式表导入第二个样式表以使用该函数,通过
@mode处理应用模板以避免导入模板。 -
@Alejandro:我正在使用第 3 方样式表,我希望将更改保持在最低限度。这就是为什么从另一个样式表 (transform2.xsl) 导入整个样式表 (transform.xsl) 在我的情况下是不可取的。此外,transform2.xsl 是动态生成的,因此在这种情况下动态生成 xsl:functions 并不是那么糟糕。
-
绝对不需要将函数复制到输出——它可以(并且应该!)作为样式表模块的一部分导入。复制函数是消极的工作——它会导致性能下降、移动部件(代码)增多和出错的可能性,并显着影响产品的可读性、可理解性和可维护性。如果给我这个糟糕的代码,我要做的第一个重构将是删除复制代码并将函数放入导入的单独样式表模块中。您需要学习,尤其是如果您是初学者!
-
@Dimitre:我也不鼓励复制代码。经过更多思考,我决定将通用函数放在一个单独的文件中。