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

Fra*_*rio 5 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>
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转换.


Dim*_*hev 1

您想要的目前在纯 XSLT(1.0 或 2.0)中是不可能的。

如果您使用Saxon 9.x XSLT 处理器,则有几个扩展函数可以实现此功能:saxon:compile-stylesheet()saxon:transform()

问题的解决方案真正需要此类功能的情况非常罕见,并且如果您描述问题,人们很可能会找到解决问题的最佳方法,而无需动态生成和执行 XSLT 样式表。