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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:21:25