我想动态创建带有动态名称的变量,以便以后在我的转换中使用,但要做到这一点,我需要动态生成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>
我可以使用XSL动态构建XSL,以便稍后在同一个脚本中运行吗?
注意:我们的XML通过运行CL XSL转换引擎的批处理进行转换;所以只是在XSL文档中引用XSL样式表不是一种选择。
答案 0 :(得分:14)
XSLT有一个特殊的内置功能,支持生成输出,即XSLT 本身。
这是 <xsl:namespace-alias>
XSLT指令。
由 the XSLT 1.0 Spec解释。:
“
<!-- 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
的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转换。
答案 1 :(得分:1)
目前在纯XSLT(1.0或2.0)中无法实现所需。
如果您使用的是Saxon 9.x XSLT processor,则可以使用以下几种扩展功能:saxon:compile-stylesheet()和saxon:transform()。
问题的解决方案真的需要这样的功能是非常罕见的,如果你描述问题很可能人们会找到解决问题的最佳方法,而不必动态生成和执行XSLT样式表。