Delphi中使用XSLT 3.0 json-to-xml()函数的技术实现疑问
嘿,我来帮你理清这两个问题的解决思路——核心在于Delphi默认的XSLT处理器(基于MSXML)只支持XSLT 1.0,而json-to-xml()是XSLT 3.0的专属特性,所以得先搞定处理器的支持,再处理JSON输入的问题。
1. 先解决XSLT 3.0的支持问题
Delphi自带的TransformNode方法依赖的MSXML引擎完全不支持XSLT 3.0,所以你必须换用支持XSLT 3.0的第三方处理器,比如Saxon-C(Saxon的C/C++版本,提供Delphi绑定)。这是实现json-to-xml()的前提。
2. 正确传递JSON作为转换源
JSON不是XML格式,直接用LoadXMLData加载到TXMLDocument肯定会报格式错误。在XSLT 3.0中,有两种靠谱的方式处理JSON输入:
方式一:将JSON作为参数传入XSLT样式表
先在你的XSLT 3.0样式表中定义一个参数接收JSON字符串,然后在样式表内部调用json-to-xml()完成转换:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义接收JSON的参数 --> <xsl:param name="json-input"/> <xsl:template match="/"> <!-- 把JSON字符串转成XML结构 --> <xsl:variable name="xml-from-json" select="json-to-xml($json-input)"/> <!-- 这里写你的后续处理逻辑,比如修改XML、转回JSON或生成HTML5 --> <xsl:copy-of select="$xml-from-json"/> </xsl:template> </xsl:stylesheet>
然后在Delphi代码中,用Saxon-C的API来设置参数并执行转换(替代原来的TransformNode):
var SaxonProcessor: TSaxonProcessor; Xslt30Processor: TXslt30Processor; TransformResult: string; YourJsonStr: string; begin YourJsonStr := '{"name":"Alice", "age":30, "tags":["delphi", "xslt3"]}'; // 你的JSON数据 SaxonProcessor := TSaxonProcessor.Create; try Xslt30Processor := SaxonProcessor.NewXslt30Processor; try // 加载你的XSLT 3.0样式表文件 Xslt30Processor.CompileFromFile('your-transform.xsl'); // 给样式表的参数传入JSON字符串 Xslt30Processor.SetParameter('json-input', YourJsonStr); // 执行转换并获取结果 TransformResult := Xslt30Processor.TransformToString; // 这里处理转换后的结果(XML/JSON/HTML等) finally Xslt30Processor.Free; end; finally SaxonProcessor.Free; end; end;
方式二:直接将JSON作为输入文档(Saxon支持)
如果你的处理器支持(比如Saxon-C),可以直接把JSON字符串作为转换的输入源,样式表中直接处理转换后的XML:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- 此时上下文节点就是json-to-xml转换后的XML根节点 --> <xsl:value-of select="/*/map/string[@key='name']"/> <!-- 后续处理逻辑 --> </xsl:template> </xsl:stylesheet>
对应的Delphi代码:
var SaxonProcessor: TSaxonProcessor; Xslt30Processor: TXslt30Processor; TransformResult: string; YourJsonStr: string; begin YourJsonStr := '{"name":"Bob", "age":25}'; SaxonProcessor := TSaxonProcessor.Create; try Xslt30Processor := SaxonProcessor.NewXslt30Processor; try Xslt30Processor.CompileFromFile('your-transform.xsl'); // 直接传入JSON字符串,指定输入类型为json TransformResult := Xslt30Processor.TransformToString(YourJsonStr, 'json'); // 处理结果 finally Xslt30Processor.Free; end; finally SaxonProcessor.Free; end; end;
为什么你的原有代码行不通?
- 你尝试把JSON加载到
TXMLDocument:LoadXMLData只能解析合法的XML,JSON不是XML,必然报格式错误。 lDoc.Node.json-to-xml写法错误:json-to-xml()是XSLT样式表中的函数,不是Delphi DOM节点的方法,不能直接在Delphi代码中调用,必须在XSLT文件里使用。
内容的提问来源于stack exchange,提问作者Jan Doggen
相关产品推荐
相关产品推荐

