XSLT 1.0调用扩展对象属性函数报错,如何访问GoodData()?
解决XSLT扩展方法访问时的CLR类型不支持问题
我来帮你搞定这个坑!你遇到的错误本质是:XSLT在处理扩展对象时,没法直接识别自定义CLR类型(也就是你的Data类)——哪怕你最终要调用的GoodData()返回字符串,只要中间步骤返回了自定义类型,就会触发这个不支持的检查。
先回顾下你的原始代码:
原始代码
XSLT部分
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:MyUtils="pda:MyUtils" exclude-result-prefixes="MyUtils"> <xsl:template match="/"> <Envelope> <xsl:variable name="entityData" select="..//ArrayOfEntityRow"/> <xsl:variable name="data" select="MyUtils:get_data().GoodData()"/> </Envelope> </xsl:template> </xsl:stylesheet>
C#扩展类部分
class MyExtension { public MyExtension() { data = new Data(); } public Data data { get; set; } } class Data { public string GoodData() { return "hello"; } }
错误原因拆解
你写的MyUtils:get_data().GoodData(),执行逻辑是先调用get_data()拿到Data对象,再调用它的GoodData()。但XSLT在处理get_data()的返回值时,发现这是个自定义的Data类型,直接就报错了——根本没机会走到调用GoodData()那一步。
两种解决方案
方案1:直接封装字符串返回方法(推荐,简单高效)
绕过中间的Data对象,在MyExtension里直接提供一个返回字符串的方法,让XSLT只和它能识别的类型打交道:
修改后的C#代码:
class MyExtension { public MyExtension() { data = new Data(); } // 把data改成私有,避免外部直接访问触发类型问题 private Data data { get; set; } // 新增直接调用GoodData并返回字符串的方法 public string GetGoodData() { return data.GoodData(); } } class Data { public string GoodData() { return "hello"; } }
对应的XSLT修改:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:MyUtils="pda:MyUtils" exclude-result-prefixes="MyUtils"> <xsl:template match="/"> <Envelope> <xsl:variable name="entityData" select="..//ArrayOfEntityRow"/> <!-- 直接调用新的GetGoodData方法 --> <xsl:variable name="data" select="MyUtils:GetGoodData()"/> </Envelope> </xsl:template> </xsl:stylesheet>
方案2:让Data类支持XSLT扩展(复杂场景适用)
如果你的Data类有大量方法需要在XSLT中调用,不想一个个封装,可以让Data类实现IXsltContextFunction接口,或者标记为可序列化,但这种配置比较繁琐,一般简单场景用方案1就足够了。
这样修改后,XSLT调用的是直接返回字符串的方法,不会再碰到自定义类型的问题,就能正常拿到"hello"的返回值了。
内容的提问来源于stack exchange,提问作者Saurav
相关产品推荐
相关产品推荐

