使用 XSLT 将 XML 转换为 JSON
Using XSLT to transform XML to JSON
我想使用 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"
}
]
推荐的方法是什么?
我正在考虑两种方法:
尝试使用 fn:xml-to-json
函数,如 https://www.w3.org/TR/xpath-functions-31/#func-xml-to-json. But as I understand, the input XML must follow a specific format defined at: https://www.w3.org/TR/xpath-functions-31/schema-for-json.xsd 中所定义。而且我还需要输出 JSON 中的字段名称具体为 "Item_Number" 和 "Item_Description".
手动编码方括号和大括号字符“[”、“]”、“{”和“}”,以及字段名称 "Item_Number" 和 "Item_Description".然后使用标准函数列出值并确保正确处理任何特殊字符。例如,“&”字符应该正常出现在 JSON 输出中。
推荐的方法是什么,或者有没有我没有考虑过的更好的方法?
我会采用第一种方法,但首先将给定输入转换为 xml-to-json()
函数期望的 XML 格式。这可能是这样的:
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>
这是采用 michael.hor257k 发布的解决方案并将其应用于我修改后的输入的结果 XML:
<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="/DATA_DS">
<!-- CONVERT INPUT TO XML FOR JSON -->
<xsl:variable name="xml">
<array>
<xsl:for-each select="G_1">
<map>
<string key="Item_Number">
<xsl:value-of select="ITEMNUMBER"/>
</string>
<string key="Item_Description">
<xsl:value-of select="ITEMDESCRIPTION"/>
</string>
</map>
</xsl:for-each>
</array>
</xsl:variable>
<!-- OUTPUT -->
<xsl:value-of select="xml-to-json($xml)"/>
</xsl:template>
</xsl:stylesheet>
对于像这样的简单映射,您还可以直接构建 XPath 3.1 数组和映射,即在本例中为映射数组:
<xsl:template match="DATA_DS">
<xsl:sequence select="array { G_1 ! map { 'Item_Number' : string(ITEMNUMBER), 'Item_Description' : string(ITEMDESCRIPTION) } }"/>
</xsl:template>
然后用<xsl:output method="json" indent="yes"/>
序列化为JSON:https://xsltfiddle.liberty-development.net/ejivdGS
主要缺点是地图没有顺序,因此您无法控制地图中项目的顺序,例如对于该示例,使用的 Saxon 版本 Item_Description
在 [=13 之前输出=].
但一般来说,转换为 xml-to-json
的格式会提供更大的灵活性,并且还允许您控制顺序,因为该函数保留了 JSON 的 XML 表示形式中的顺序。
我想使用 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"
}
]
推荐的方法是什么?
我正在考虑两种方法:
尝试使用
fn:xml-to-json
函数,如 https://www.w3.org/TR/xpath-functions-31/#func-xml-to-json. But as I understand, the input XML must follow a specific format defined at: https://www.w3.org/TR/xpath-functions-31/schema-for-json.xsd 中所定义。而且我还需要输出 JSON 中的字段名称具体为 "Item_Number" 和 "Item_Description".手动编码方括号和大括号字符“[”、“]”、“{”和“}”,以及字段名称 "Item_Number" 和 "Item_Description".然后使用标准函数列出值并确保正确处理任何特殊字符。例如,“&”字符应该正常出现在 JSON 输出中。
推荐的方法是什么,或者有没有我没有考虑过的更好的方法?
我会采用第一种方法,但首先将给定输入转换为 xml-to-json()
函数期望的 XML 格式。这可能是这样的:
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>
这是采用 michael.hor257k 发布的解决方案并将其应用于我修改后的输入的结果 XML:
<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="/DATA_DS">
<!-- CONVERT INPUT TO XML FOR JSON -->
<xsl:variable name="xml">
<array>
<xsl:for-each select="G_1">
<map>
<string key="Item_Number">
<xsl:value-of select="ITEMNUMBER"/>
</string>
<string key="Item_Description">
<xsl:value-of select="ITEMDESCRIPTION"/>
</string>
</map>
</xsl:for-each>
</array>
</xsl:variable>
<!-- OUTPUT -->
<xsl:value-of select="xml-to-json($xml)"/>
</xsl:template>
</xsl:stylesheet>
对于像这样的简单映射,您还可以直接构建 XPath 3.1 数组和映射,即在本例中为映射数组:
<xsl:template match="DATA_DS">
<xsl:sequence select="array { G_1 ! map { 'Item_Number' : string(ITEMNUMBER), 'Item_Description' : string(ITEMDESCRIPTION) } }"/>
</xsl:template>
然后用<xsl:output method="json" indent="yes"/>
序列化为JSON:https://xsltfiddle.liberty-development.net/ejivdGS
主要缺点是地图没有顺序,因此您无法控制地图中项目的顺序,例如对于该示例,使用的 Saxon 版本 Item_Description
在 [=13 之前输出=].
但一般来说,转换为 xml-to-json
的格式会提供更大的灵活性,并且还允许您控制顺序,因为该函数保留了 JSON 的 XML 表示形式中的顺序。