Xslt 将元素(xsl:function)从样式表复制到;“结果”;XML

Xslt 将元素(xsl:function)从样式表复制到;“结果”;XML,xslt,copy,xls,Xslt,Copy,Xls,首先,我应该说我是XSLT的初学者 虽然确切的上下文可能不太相关(并且可能太混乱),但我将在下面提供它。 我有一个链式转换,如下所示: Input.xml是此转换的输入文件,它使用transform.xsl执行。此转换的结果是output.xmltransform.xml包含一个经典的自定义xsl:function: xsl:function name="my:f" xsl:sequence select=".. xpath .." xsl:function 对于步骤2,步骤

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

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

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

    xsl:function name="my:f"
         xsl:sequence select=".. xpath .."   
    xsl:function
    
  • 对于步骤2,步骤1(
    output.xml
    )的结果是一个新的转换器(
    transform2.xsl
    ),它将使用一些其他xml输入(比如
    input2.xml

  • 我想做的是将
    xsl:function
    节点全部复制到
    output.xml
    ,以便在步骤2中使用。 在这种情况下,复制
    xsl:function
    时不需要对其进行更新/更改(只是一个简单的节点副本)。 请注意,我不想仅在给定的输入元素(来自
    input.xml
    )存在时复制
    xsl:function
    。但是,我希望始终复制它,不管
    input.xml
    是什么

    现在我知道这可以通过使用一个单独的文件来实现,该文件包含我的
    xsl:function
    ,然后使用
    xsl:import
    从两个转换(
    transform.xml
    transform2.xml
    )中包含此文件

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

    提前感谢,


    M.

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

    <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>
    

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

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

    <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>
    

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

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

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

    @user414366:不清楚为什么要动态构建XSLT2.0。如果您无法更改第一个样式表以隔离公共样式表模块中的函数声明,则可以将第一个样式表导入第二个样式表以使用该函数,通过
    @模式
    应用模板以避免导入模板。@Alejandro:我使用的是第三方样式表,我希望将更改保持在最低限度。这就是为什么从另一个样式表(transform2.xsl)导入整个样式表(transform.xsl)在我的例子中是不可取的。此外,transform2.xsl是动态生成的,因此在这种情况下动态生成xsl:functions并不是那么糟糕。完全不需要将函数复制到输出中——它可以(而且应该!)作为样式表模块的一部分导入。复制功能是一项消极的工作——它会导致性能下降、移动部件(代码)增多和出错的可能性,并显著影响产品的可读性、可理解性和可维护性。如果给我这些糟糕的代码,我首先要做的重构之一就是删除复制代码,并将函数放入导入的单独样式表模块中。你需要学习,尤其是如果你是初学者的话@迪米特里:我也不鼓励复制代码。经过深思熟虑,我决定将公共函数放在一个单独的文件中。@user414366:不清楚为什么要动态构建XSLT 2.0。如果您无法更改第一个样式表以隔离公共样式表模块中的函数声明,则可以将第一个样式表导入第二个样式表以使用该函数,通过
    @模式
    应用模板以避免导入模板。@Alejandro:我使用的是第三方样式表,我希望将更改保持在最低限度。这就是为什么从另一个样式表(transform2.xsl)导入整个样式表(transform.xsl)在我的例子中是不可取的。此外,transform2.xsl是动态生成的,因此在这种情况下动态生成xsl:functions并不是那么糟糕。完全不需要将函数复制到输出中——它可以(而且应该!)作为样式表模块的一部分导入。复制功能是一项消极的工作——它会导致性能下降、移动部件(代码)增多和出错的可能性,并显著影响产品的可读性、可理解性和可维护性。如果给我这些糟糕的代码,我首先要做的重构之一就是删除复制代码,并将函数放入导入的单独样式表模块中。你需要学习,尤其是如果你是初学者的话@迪米特里:我也不鼓励复制代码。经过深思熟虑后,我决定将通用函数放在一个单独的文件中。非常感谢您的回答,Martin!你回答得太快了。。很好:)我不知道您可以通过这种方式使用document()来访问document节点。今天我学到了一些东西:)非常感谢你的回答,马丁!你回答得太快了。。很好:)我不知道您可以通过这种方式使用document()来访问document节点。今天我学到了一些东西:)卢塞罗,我会