我想动态创建带有动态名称的变量,以便以后在我的转换中使用,但要做到这一点,我需要动态生成XSL,然后在同一个脚本中运行它.
这只是我正在寻找的一个粗略的伪代码示例.
<xsl:for-each select="//constants/constant" >
<xsl:variable >
<xsl:attribute name="name">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:attribute name="select">
<xsl:value-of select="@value"/>
</xsl:attribute>
</xsl:variable>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
我可以使用XSL动态构建XSL以便稍后在同一个脚本中运行吗?
注意:我们的XML通过运行CL XSL转换引擎的批处理进行转换; 因此,仅在XSL文档中引用XSL样式表不是一种选择.
Dim*_*hev 14
XSLT有一个特殊的内置功能,支持生成输出,即XSLT本身.
这是<xsl:namespace-alias>
XSLT指令.
正如 XSLT 1.0规范所解释的那样:
"
<!-- Category: top-level-element --> <xsl:namespace-alias stylesheet-prefix = prefix | "#default" result-prefix = prefix | "#default" />
样式表可以使用该xsl:namespace-alias
元素声明一个名称空间URI是另一个名称空间URI 的别名.如果已将文字命名空间URI声明为另一个命名空间URI的别名,则结果树中的命名空间URI将是文字命名空间URI为其别名的命名空间URI,而不是文字命名空间URI本身.该xsl:namespace-alias
元素声明绑定到stylesheet-prefix
属性指定的前缀的名称空间URI是绑定到result-prefix
属性指定的前缀的名称空间URI的别名.因此,该stylesheet-prefix
属性指定将出现在样式表中的名称空间URI,该result-prefix
属性指定将出现在结果树中的相应名称空间URI."
这是一个生成xsl:stylesheet
包含a的转换的小例子xsl:variable
,它以所需的方式构造:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/> <xsl:template match="/*"> <xxx:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xxx:variable name="{@name}"> <xsl:value-of select="."/> </xxx:variable> </xxx:stylesheet> </xsl:template> </xsl:stylesheet>
将此转换应用于以下XML文档时:
<v name="myVarName">myValue</v>
产生了想要的结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="myVarName">myValue</xsl:variable> </xsl:stylesheet>
然后下一步将在您的"脚本"中启动这个动态生成的XSLT转换.
您想要的目前在纯 XSLT(1.0 或 2.0)中是不可能的。
如果您使用Saxon 9.x XSLT 处理器,则有几个扩展函数可以实现此功能:saxon:compile-stylesheet()和saxon:transform()。
问题的解决方案真正需要此类功能的情况非常罕见,并且如果您描述问题,人们很可能会找到解决问题的最佳方法,而无需动态生成和执行 XSLT 样式表。