使用XSL生成在同一脚本中执行的动态XSL?

时间:2008-12-10 21:29:56

标签: xml xslt dynamic

我想动态创建带有动态名称的变量,以便以后在我的转换中使用,但要做到这一点,我需要动态生成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样式表不是一种选择。

2 个答案:

答案 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样式表。