XSLT 中用 JavaScript 自定义函数处理参数

曾经写过一篇 XSLT 文件中使用C#/JScript/VB 自定义函数 怎么用 C#/JScript/VB 在 XSL/XSLT 中自定义函数。那时候原本想直接用 JavaScript 来自定义函数,因为 JavaScript 哪台机器上都能跑,但出了些问题,所以实际中是用的 C# 自定义的 XSLT 函数。

这样的问题无论从哪方面讲都一直回避不了,情况是如果在 JavaScript 定义函数中直接把传入的参数返回是没问题的,但要作任何的处理,或者调用 JS 函数都会失败。XSLT 中的自定义函数,不对参数进行加工处理是没有意义的。比如在 XSLT 中写如下函数:

其实上面那个 show 也是什么事都没做,除非是 return blogUrl; 否则就会报错:

Function 'show' did not return a value, or it returned a value that cannot be converted to an XSL data type.

如果执行的是第二行代码提示的错误将会是:

Microsoft JScript runtime error Object doesn't support this property or method line = 18, col = 3 (line is offset from the s...

出错那时我也没太明白过来是什么原因出错的,因为我也是想当然的认为传入的参数是个字符串,其实不然,若用 typeof(blogUrl) 看下就知道它总是个 object。因为不光是文本节点会作为参数,其他的节点也可能放进来,又因为 C# 是强类型的,因而在用 C# 自定义 XSLT 函数时幸免了。

解决办法是,必须指明类型,即调时的代码的 myfn:show(blogUrl) 必须写成 myfn:show(string(blogUrl))。如果是数字类型就用 number(level)。严格说来 string() 和 number() 并不是在做类型转换,它们都是XPATH 中的函数,即默认为 fn 命名空间下的函数。你也可以试下别的,不过一般我们在自定义函数中处理那些文本或数字的就足矣,笼统来说用 string() 先全部得到对应的字符串就行,只要其中的数据不丢失即可。

最后也完整的补个例子吧,在 xml 中指定一个 xstl 文件,这样就可以直接在 IE 中浏览到转换后的效果,而且也只能在微软的 IE 出成果,大约是用了 xmlns:msxsl="urn:schemas-microsoft-com:xslt" 这样非规范的东西。

text.xml

test.xsl

参考: 1. XPath、XQuery 以及 XSLT 函数
        2. XML XSLT parameters Javascript - how to make it work in Mozilla...
        3. W3Schools Forum > XML Forums > XSLT

类别: XML/DOM. 标签: , , . 阅读(995). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar