【问题标题】:Copying an element (xsl:function) from the stylesheet to the "result" XML将元素 (xsl:function) 从样式表复制到“结果”XML
【发布时间】:2023-03-09 05:21:01
【问题描述】:

首先,我应该说我是 XSLT 方面的初学者。

虽然确切的上下文可能不那么相关(并且可能过于混乱),但我将在下面提供。 我有一个链式转换,如下所示:

  1. Input.xml 是此转换的输入文件,使用transform.xsl 执行。这个转换的结果是output.xmltransform.xml 包含一个经典的自定义xsl:function

    xsl:function name="my:f"
         xsl:sequence select=".. xpath .."   
    xsl:function
    
  2. 第 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.xmltransform2.xml)。

但我想知道是否还有其他方法可以实现这一点(..没有声明/定义函数的单独文件)?

提前致谢,

M.

【问题讨论】:

  • @user414366:不清楚为什么要动态构建 XSLT 2.0。如果您无法更改第一个样式表以隔离通用样式表模块中的函数声明,您可以将第一个样式表导入第二个样式表以使用该函数,通过@mode 处理应用模板以避免导入模板。
  • @Alejandro:我正在使用第 3 方样式表,我希望将更改保持在最低限度。这就是为什么从另一个样式表 (transform2.xsl) 导入整个样式表 (transform.xsl) 在我的情况下是不可取的。此外,transform2.xsl 是动态生成的,因此在这种情况下动态生成 xsl:functions 并不是那么糟糕。
  • 绝对不需要将函数复制到输出——它可以(并且应该!)作为样式表模块的一部分导入。复制函数是消极的工作——它会导致性能下降、移动部件(代码)增多和出错的可能性,并显着影响产品的可读性、可理解性和可维护性。如果给我这个糟糕的代码,我要做的第一个重构将是删除复制代码并将函数放入导入的单独样式表模块中。您需要学习,尤其是如果您是初学者!
  • @Dimitre:我也不鼓励复制代码。经过更多思考,我决定将通用函数放在一个单独的文件中。

标签: xslt copy xls


【解决方案1】:

您可以使用document('') 访问样式表文档,例如

<xsl:template match="/*">
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:copy-of select="document('')/xsl:stylesheet/xsl:function"/>
    <xsl:apply-templates/>
  </xsl:stylesheet>
</xsl:template>

应该将样式表中的任何xsl:function 元素复制到结果树中。

[编辑] 编辑后,您似乎想复制某个名称的功能:如果您想复制某个名称的功能,那么您可以执行例如

<xsl:copy-of select="document('')/xsl:stylesheet/xsl:function[
        resolve-QName(@name, .) eq QName('http://example.com/ns', 'f')]"/>

其中f 是函数的本地名称,http://example.com/ns 是定义函数的命名空间。

【讨论】:

  • 非常感谢马丁的回答!你回答得这么快.. 这么好:) 我不知道你可以用这种方式使用 document() 来访问文档节点。我今天学到了一些东西:)
【解决方案2】:

您可以使用 document() 内置函数,该函数将返回 emtpy URI 的样式表文档。然后你可以将元素复制到输出中。

【讨论】:

  • Lucero,我也要谢谢你!但马丁先回答,所以这次我会标记他的回答。
猜你喜欢
  • 2011-05-28
  • 2012-09-27
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多