You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:37:35