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中。
- 编写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"); } }
- 在执行转换前注册扩展对象,关联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
相关产品推荐
相关产品推荐

