Xslt 将元素(xsl:function)从样式表复制到;“结果”;XML
首先,我应该说我是XSLT的初学者 虽然确切的上下文可能不太相关(并且可能太混乱),但我将在下面提供它。 我有一个链式转换,如下所示: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,步骤
Input.xml
是此转换的输入文件,它使用transform.xsl
执行。此转换的结果是output.xml
transform.xml
包含一个经典的自定义xsl:function:
xsl:function name="my:f"
xsl:sequence select=".. xpath .."
xsl:function
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节点。今天我学到了一些东西:)卢塞罗,我会