我制作了一个使用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
?
答案 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扩展功能。