xsl:script可以与XMLCompiledTransform一起使用吗?

时间:2011-07-08 19:17:25

标签: .net xslt embedded-script

我制作了一个使用msxml:脚本的XSL脚本与XMLCompiledTransform一起使用,但是需要它的人说这个脚本不适用于他们的Linux / Perl环境(这就像我知道他们是怎么一样的使用XSL)因为它“使用Microsoft特定的扩展”。所以我试图通过使用xsl:script使XSL更加中立。但是,我很难让它发挥作用。

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:theScript="urn:CustomScript" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xsl theScript fo xs fn">
<xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8" omit-xml-declaration="no"/>
  <xsl:script language="javascript" implements-prefix="theScript">
      <![CDATA[
      function test() {return "test"; }
      ]]>
  </xsl:script>
  <xsl:template match="/">
    <test>
      <xsl:value-of select="theScript:test()" />
    </test>
  </xsl:template>
</xsl:stylesheet>

上面给出了错误“无法找到实现前缀'urn:CustomScript'的脚本或外部对象。”

如果我摆脱xmlns:theScript="urn:CustomScript",它会给我一个错误“Prefix'theScript'未定义。”

我也尝试删除所有“theScript”前缀的痕迹,只使用implements-prefix="local",但这也不起作用。它告诉我test是一个未知的XSLT函数。

我在这里做错了什么,或者XMLCompiledTransform不支持​​xsl:script

2 个答案:

答案 0 :(得分:2)

xsl:script仅在XSLT1.1中定义,但是此标准被取消而支持XSLT2.0,所以如果您正在寻找可移植性,我不建议使用它。

最便携的XSLT形式绝对是XSLT1.0,因为它有更多的支持。虽然XSLT2.0中的某些内容肯定更容易,但您可能会发现您可能想要执行的大多数“脚本”代码只能在XSLT中完成。 XSLT2.0可以定义函数,但是你可以在XSLT1.0中使用命名模板来模拟函数,它只是有点麻烦。

XSLT2.0:

<xsl:template match="/">
  <xsl:value-of select="test('param')" />
</xsl:template>

<xsl:function name="test" as="xs:string">
  <xsl:param name="param" as="xs:string" />
  <xsl:text>Test</xsl:text>
</xsl:function>

XSLT1.0:

<xsl:template match="/">
  <xsl:call-template name="test">
    <xsl:with-param name="param" select="'param'" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="test">
  <xsl:param name="param" />
  <xsl:text>Test</xsl:text>
</xsl:template>

然而,在这个例子中没有使用参数,但是你明白了。

答案 1 :(得分:1)

XSLT中没有xsl:script指令。

没有XMLCompiledTransform类属于NET。

System.Xml.Xsl命名空间中.NET附带的现有XslCompiledTransform类实现了兼容的XSLT 1.0处理器 - 因此它不支持任何指令xsl:script

建议:要实现XSLT应用程序的真正可移植性,请不要使用任何(内联或非内联)扩展函数或未记录,非强制或不合规的功能。

虽然许多XSLT 1.0处理器支持EXSLT,但XslCompiledTransform处理器仅支持node-set() EXSLT扩展功能。