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

XSLT3.0处理含HTML结构的JSON转XML需求问询

单份XSLT 3.0即可完成需求

完全可以用单份XSLT 3.0实现JSON转XML,同时处理content字段内的转义HTML——替换指定div为RootElementforContent并保留内部HTML结构。核心思路是先将JSON转成XML,再解析转义的HTML片段,最后替换目标节点。

实现代码示例

假设你的JSON输入结构如下(content字段包含转义HTML):

{
  "title": "示例文档",
  "content": "<div><h2>标题</h2><p>这是一段带<b>加粗</b>的文本</p></div>"
}

对应的XSLT 3.0代码:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <!-- 处理输入的JSON,先转成初始XML结构 -->
  <xsl:template match="/">
    <xsl:variable name="json-raw-xml" select="json-to-xml(.)"/>
    <xsl:apply-templates select="$json-raw-xml/node()"/>
  </xsl:template>

  <!-- 匹配content字段对应的XML节点,处理转义HTML -->
  <xsl:template match="string[@key='content']">
    <!-- 解析转义的HTML片段为节点集 -->
    <xsl:variable name="html-nodes" select="parse-xml-fragment(.)"/>
    <!-- 替换外层div为RootElementforContent,保留内部内容 -->
    <RootElementforContent>
      <xsl:apply-templates select="$html-nodes/div/node()"/>
    </RootElementforContent>
  </xsl:template>

  <!-- 默认模板:复制其他JSON节点的结构 -->
  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  1. JSON转XML:用XSLT 3.0内置函数json-to-xml()将JSON转换为标准结构的XML,其中content字段会被转为<string key="content">转义HTML字符串</string>。
  2. 解析转义HTML:通过parse-xml-fragment()把content里的转义HTML字符串解析为可操作的XML节点集。
  3. 替换节点:直接提取原div的子节点,包裹到RootElementforContent中,完成替换并保留内部HTML结构。

扩展场景处理

如果需要替换content字段内所有div节点(而非仅外层div),可以添加模式模板实现递归替换:

<!-- 替换content里的所有div -->
<xsl:template match="string[@key='content']">
  <xsl:variable name="html-nodes" select="parse-xml-fragment(.)"/>
  <xsl:apply-templates select="$html-nodes" mode="replace-div"/>
</xsl:template>

<xsl:template match="div" mode="replace-div">
  <RootElementforContent>
    <xsl:apply-templates select="@*|node()" mode="replace-div"/>
  </RootElementforContent>
</xsl:template>

<!-- 复制其他HTML节点和属性 -->
<xsl:template match="@*|node()" mode="replace-div">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates mode="replace-div"/>
  </xsl:copy>
</xsl:template>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:17:08