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

XSLT调用str:tokenize函数报错,求.NET 6.0环境下解决方案

解决方案

方案1:用原生XSLT模板替代EXSLT的str:tokenize

.NET的XslCompiledTransform默认不支持EXSLT扩展,你可以自己写递归XSLT模板实现字符串拆分,完全不需要依赖外部扩展。

把以下模板添加到你的XSLT文件中:

<xsl:template name="tokenize">
  <xsl:param name="input" />
  <xsl:param name="delimiter" />
  
  <xsl:if test="$input != ''">
    <xsl:choose>
      <xsl:when test="contains($input, $delimiter)">
        <token>
          <xsl:value-of select="substring-before($input, $delimiter)" />
        </token>
        <xsl:call-template name="tokenize">
          <xsl:with-param name="input" select="substring-after($input, $delimiter)" />
          <xsl:with-param name="delimiter" select="$delimiter" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <token>
          <xsl:value-of select="$input" />
        </token>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:if>
</xsl:template>

调用时替换原str:tokenize调用,改为调用这个模板:

<xsl:call-template name="tokenize">
  <xsl:with-param name="input" select="你的目标字符串" />
  <xsl:with-param name="delimiter" select="'分隔符'" /> <!-- 例如空格用' ' -->
</xsl:call-template>

这种方式用原生XSLT 1.0语法实现相同功能,彻底避免扩展依赖问题。

方案2:注册自定义.NET扩展对象

如果一定要保留EXSLT的命名空间和函数名,可以自己写.NET类实现tokenize方法,再注册到XslCompiledTransform中。

  1. 编写C#扩展类:
public class ExsltStringsExtension
{
    public XPathNodeIterator Tokenize(string input, string delimiter)
    {
        if (string.IsNullOrEmpty(input))
            return XPathEmptyIterator.Instance;
            
        var tokens = input.Split(new[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
        var doc = new XmlDocument();
        doc.LoadXml("<tokens>" + string.Join("", tokens.Select(t => $"<token>{t}</token>")) + "</tokens>");
        return doc.CreateNavigator().Select("/tokens/token");
    }
}
  1. 在执行转换前注册扩展对象,关联EXSLT字符串命名空间:
var xslt = new XslCompiledTransform();
xslt.Load("你的XSLT文件路径");

var args = new XsltArgumentList();
// 命名空间必须和XSLT中声明的完全一致
args.AddExtensionObject("http://exslt.org/strings", new ExsltStringsExtension());

// 执行转换
using (var output = new FileStream("输出文件路径", FileMode.Create))
{
    xslt.Transform("输入KML文件路径", args, output);
}

同时确保XSLT文件中正确声明命名空间:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:str="http://exslt.org/strings"
                exclude-result-prefixes="str">

这样XslCompiledTransform就能识别str:tokenize函数了。


内容的提问来源于stack exchange,提问作者sibeyzoran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:37:28