使用 XSLT 将 XML 转换为 JSON

2024-04-13

我想使用 XSLT 将一些 XML 转换为 JSON。
XML 如下所示:

<DATA_DS>
    <G_1>
        <ORGANIZATION_NAME>My Company 1</ORGANIZATION_NAME>
        <ORGANIZATIONID>901</ORGANIZATIONID>
        <ITEMNUMBER>20001</ITEMNUMBER>
        <ITEMDESCRIPTION>Item Description 1</ITEMDESCRIPTION>
    </G_1>
    <G_1>
        <ORGANIZATION_NAME>My Company 1</ORGANIZATION_NAME>
        <ORGANIZATIONID>901</ORGANIZATIONID>
        <ITEMNUMBER>20002</ITEMNUMBER>
        <ITEMDESCRIPTION>Item Description 2</ITEMDESCRIPTION>
    </G_1>
    <G_1>
        <ORGANIZATION_NAME>My Company 1</ORGANIZATION_NAME>
        <ORGANIZATIONID>901</ORGANIZATIONID>
        <ITEMNUMBER>20003</ITEMNUMBER>
        <ITEMDESCRIPTION>Item Description 3</ITEMDESCRIPTION>
    </G_1>
</DATA_DS>

我希望 JSON 如下所示:

    [
        {
            "Item_Number":"20001",
            "Item_Description":"Item Description 1"
        },
        {
            "Item_Number":"20002",
            "Item_Description":"Item Description 2"
        },
        {
            "Item_Number":"20003",
            "Item_Description":"Item Description 3"
        }
    ]

推荐的方法是什么?

我正在考虑两种方法:

  1. 尝试使用fn:xml-to-json函数,定义为https://www.w3.org/TR/xpath-functions-31/#func-xml-to-json https://www.w3.org/TR/xpath-functions-31/#func-xml-to-json。但据我了解,输入 XML 必须遵循以下定义的特定格式:https://www.w3.org/TR/xpath-functions-31/schema-for-json.xsd https://www.w3.org/TR/xpath-functions-31/schema-for-json.xsd。我还需要输出 JSON 中的字段名称具体为“Item_Number”和“Item_Description”。

  2. 手动编码方括号和大括号字符“[”、“]”、“{”和“}”以及字段名称“Item_Number”和“Item_Description”。然后使用标准函数列出值并确保正确处理任何特殊字符。例如,“&”字符应正常出现在 JSON 输出中。

推荐的方法是什么,或者是否有我没有考虑过的更好的方法?


我会采用第一种方法,但首先将给定的输入转换为预期的 XML 格式xml-to-json()功能。这可能是这样的:

XSLT 3.0

<xsl:stylesheet version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/G_1">
    <!-- CONVERT INPUT TO XML FOR JSON -->
    <xsl:variable name="xml">
        <array>
            <xsl:for-each-group select="*" group-starting-with="ORGANIZATION_NAME">
                <map>
                    <string key="Item_Number">
                        <xsl:value-of select="current-group()[self::ITEMNUMBER]"/>
                    </string>
                    <string key="Item_Description">
                        <xsl:value-of select="current-group()[self::ITEMDESCRIPTION]"/>
                    </string>
                </map>
            </xsl:for-each-group>
        </array>
    </xsl:variable>
    <!-- OUTPUT -->
    <xsl:value-of select="xml-to-json($xml)"/>
</xsl:template>

</xsl:stylesheet>

Demo: https://xsltfiddle.liberty-development.net/bFWR5DQ https://xsltfiddle.liberty-development.net/bFWR5DQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 XSLT 将 XML 转换为 JSON 的相关文章

随机推荐

  • ubuntu `env:'pg_dump':没有这样的文件或目录`错误

    ubuntu 16 10 中缺少 pg dump 环境变量或文件 运行并安装后sudo apt get install postgresql client see pg dump 和 pg restore 错误的含义是什么 https st
  • 使用 .net core 3.0 并使用 /p:PublishSingleFile=true 标志时如何获取可执行文件的实际路径?

    我最近将一个应用程序升级到 dotnet core 3 并在构建过程中开始使用 PublishSingleFile 标志 通过这两个更改 查找可执行路径的方式发生了变化 现在 我不再获取可执行文件所在的路径 而是重定向到以下位置的随机目录
  • 包含一个主要可执行文件和一个辅助应用程序的应用程序包

    我编写了一个应用程序 它使用外部ask pass 我为gui工具编写的一个小应用程序 cmd行工具来访问ssh 到目前为止 在开发模式下一切都运行良好 但是 当我想要存档 捆绑该应用程序时 它会为我创建一个包含 2 个可执行文件的 zip
  • 如何检测在fragment android中按下后退按钮的时间?

    我的项目带有带片段的导航抽屉 有 5 个菜单 问题是当我转到菜单 4 并按下后退按钮时 应用程序关闭 但我需要应用程序返回到第一个菜单 即片段中的所有菜单 这是主要活动 导航抽屉 的代码 public class MainActivity
  • Symfony 表单(作为 Doctrine 的独立组件)EntityType 不起作用

    我使用 Symfony 表单 v3 0 而不使用 Symfony 框架的其余部分 使用 Dotrine v2 5 我创建了一个表单 这是表单类型类 class CreateMyEntityForm extends BaseFormType
  • Python 中的“布尔”运算(即:和/或运算符)

    此方法搜索第一组单词字符 即 a zA Z0 9 返回第一个匹配的组或None万一失败 def test str m re search r w str if m return m group 1 return None 相同的函数可以重写
  • 在 Postgres 中添加 current_timestamp 和 days 列的总和

    我想通过向当前时间添加天数来更新列 用伪语法来说 它是 UPDATE foo SET time current timestamp days integer days 是同一个表中的一列 select now cast 1 day as i
  • 64位进程的进程内存限制

    我目前有一个 32 位 Net 应用程序 在 x86 Windows 上 需要大量内存 最近它开始抛出 System OutOfMemoryException 因此 我计划将其作为 64 位进程迁移到 x64 平台 这将有助于解决内存不足的
  • doc2vec 获得良好性能所需的最小数据集大小是多少?

    在不同大小的数据集上进行训练时 doc2vec 的表现如何 原始语料库中没有提到数据集大小 所以我想知道从 doc2vec 中获得良好性能所需的最小大小是多少 有很多东西被称为 doc2vec 但它似乎最常指的是 Le 和 Mikolov
  • Powershell 将变量传递给带有通配符的过滤器

    我在这方面遇到了困难 我知道这可能是一个简单的语法问题 我不知道如何将此变量传递到代码块中并正确确认它 user Some Person 这正如我所期望的那样 get aduser filter Samaccountname eq user
  • 时间:2019-03-17 标签:c#InfragisticsUltraChartLineChart

    有人可以提供一个从数据表将线系列添加到 UltraChart 的简单示例吗 该表具有时间序列值 x 轴上的时间值 y 轴上的测量 双精度 值 到目前为止 我见过的将时间序列添加到图表中的唯一示例是针对一组有限的硬编码数据点 我希望能够从表中
  • 如何从字符串中提取数字?

    我有包含路径的字符串 string toto titi 12 tata 2 abc def 我只想从该字符串中提取数字 要提取第一个数字 tmp string toto titi num1 tmp tata 要提取第二个数字 tmp str
  • 从 Oracle 转换为日期时间

    我知道有很多类似的问题 但我找不到我要找的东西 这是我的甲骨文日期 string testdate 2014 01 07 15 00 00 0000000 这是我尝试转换为日期时间的方法 DateTime ParseExact testda
  • ASP.NET MVC - 模型绑定一组动态生成的复选框 - 如何

    我正在尝试对一组动态生成的复选框进行模型绑定 以便在控制器操作中处理它们 但无法进行模型绑定 这是场景 我的 ViewModel 类 DocumentAddEditModel 包含一个字典 Dictionary 其中每个条目的字符串是每个复
  • Python opencv 检测棋盘

    我正在尝试获取棋盘图案的角点 并认为我可以将 openCV 与cv2 findChessboardCorners 但是 我找不到传递给该函数的良好参数 以便它成功检测棋盘 我认为该图像适合此功能 如果不是 我不知道我应该做什么预处理 这是我
  • 简单的 MySQL 语法错误 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在运行以下代码 但找不到错误是什么 谁能建议我应该检查什么 result mysql query SELECT FROM ta
  • Elastic Beanstalk 运行部署后脚本

    我的 Node js 应用程序由两部分组成 一个 Express 后端和一个 React 前端 我在这个结构中有两个 package json 文件 package json app package json 我想要做的是在我的前端文件夹应
  • 在标题中添加图像标题和/或描述

    是否可以操纵图像标题的输出内容以这种方式 不仅在每个图像下输出标题 而且还输出图像标题和 或描述 在媒体库中定义 可能通过functions php 是的 可以操纵the content 您想要做的最简单的方法是在您的functions p
  • NSUserDefaults 和 Lion 下的沙箱

    根据 Apple 的要求 将我的项目之一移至支持沙箱 我像这样使用 UserDefaults NSUserDefaults standardUserDefaults setObject myNumber forKey myNumberKey
  • 使用 XSLT 将 XML 转换为 JSON

    我想使用 XSLT 将一些 XML 转换为 JSON XML 如下所示