XSLT 3.0 中 JSON 到 XML 的转换
JSON to XML transformation in XSLT 3.0
我正在尝试使用 json-to-xml 函数将 JSON 数据转换为 XSLT 3.0 中的 XML,但生成的 xml 是不如预期
例如输入JSON:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
从 XSLT3.0 生成 XML:
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="glossary">
<string key="title">example glossary</string>
<map key="GlossDiv">
<string key="title">S</string>
<map key="GlossList">
<map key="GlossEntry">
<string key="ID">SGML</string>
<string key="SortAs">SGML</string>
<string key="GlossTerm">Standard Generalized Markup Language</string>
<string key="Acronym">SGML</string>
<string key="Abbrev">ISO 8879:1986</string>
<map key="GlossDef">
<string key="para">A meta-markup language, used to create markup languages such as DocBook.</string>
<array key="GlossSeeAlso">
<string>GML</string>
<string>XML</string>
</array>
</map>
<string key="GlossSee">markup</string>
</map>
</map>
</map>
预期XML格式:
<glossary>
<title>example glossary</title>
<GlossDiv>
<title>S</title>
<GlossList>
<GlossEntry>
<ID>SGML</ID>
<SortAs>SGML</SortAs>
<GlossTerm>Standard Generalized Markup Language</GlossTerm>
<Acronym>SGML</Acronym>
<Abbrev>ISO 8879:1986</Abbrev>
<GlossDef>
<para>A meta-markup language, used to create markuplanguages such as DocBook.</para>
<GlossSeeAlso OtherTerm="GML">
<GlossSeeAlso OtherTerm="XML">
</GlossDef>
<GlossSee OtherTerm="markup">
</GlossEntry>
</GlossList>
</GlossDiv>
</glossary>
我的主要问题是忽略这些键属性并将属性(键)值打印为元素名称,将实际文本打印为元素文本。
你们能帮我实现这个目标吗?
您的 "expected" 输出似乎不是基于对规范的任何阅读:
https://www.w3.org/TR/xslt-30/#json-to-xml-mapping
我们的想法是,您获得的 XML 无损地捕获了 JSON 中的所有内容;您可以轻松地将其转换为您想要的形式,然后您可以做出自己的决定,例如,处理无效的 JSON 键 XML 元素名称,或何时使用元素以及何时使用元素使用属性。
您可以通过一些简单的规则获得您想要的大部分内容,例如:
<xsl:template match="*[@key]">
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="array">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="array[@key]/*">
<xsl:element name="{../@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
但是你的一些规则似乎是特定于词汇的,例如我不明白为什么你对 GlossSee
和 title
的处理方式不同。
我正在尝试使用 json-to-xml 函数将 JSON 数据转换为 XSLT 3.0 中的 XML,但生成的 xml 是不如预期
例如输入JSON:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
从 XSLT3.0 生成 XML:
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="glossary">
<string key="title">example glossary</string>
<map key="GlossDiv">
<string key="title">S</string>
<map key="GlossList">
<map key="GlossEntry">
<string key="ID">SGML</string>
<string key="SortAs">SGML</string>
<string key="GlossTerm">Standard Generalized Markup Language</string>
<string key="Acronym">SGML</string>
<string key="Abbrev">ISO 8879:1986</string>
<map key="GlossDef">
<string key="para">A meta-markup language, used to create markup languages such as DocBook.</string>
<array key="GlossSeeAlso">
<string>GML</string>
<string>XML</string>
</array>
</map>
<string key="GlossSee">markup</string>
</map>
</map>
</map>
预期XML格式:
<glossary>
<title>example glossary</title>
<GlossDiv>
<title>S</title>
<GlossList>
<GlossEntry>
<ID>SGML</ID>
<SortAs>SGML</SortAs>
<GlossTerm>Standard Generalized Markup Language</GlossTerm>
<Acronym>SGML</Acronym>
<Abbrev>ISO 8879:1986</Abbrev>
<GlossDef>
<para>A meta-markup language, used to create markuplanguages such as DocBook.</para>
<GlossSeeAlso OtherTerm="GML">
<GlossSeeAlso OtherTerm="XML">
</GlossDef>
<GlossSee OtherTerm="markup">
</GlossEntry>
</GlossList>
</GlossDiv>
</glossary>
我的主要问题是忽略这些键属性并将属性(键)值打印为元素名称,将实际文本打印为元素文本。
你们能帮我实现这个目标吗?
您的 "expected" 输出似乎不是基于对规范的任何阅读:
https://www.w3.org/TR/xslt-30/#json-to-xml-mapping
我们的想法是,您获得的 XML 无损地捕获了 JSON 中的所有内容;您可以轻松地将其转换为您想要的形式,然后您可以做出自己的决定,例如,处理无效的 JSON 键 XML 元素名称,或何时使用元素以及何时使用元素使用属性。
您可以通过一些简单的规则获得您想要的大部分内容,例如:
<xsl:template match="*[@key]">
<xsl:element name="{@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="array">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="array[@key]/*">
<xsl:element name="{../@key}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
但是你的一些规则似乎是特定于词汇的,例如我不明白为什么你对 GlossSee
和 title
的处理方式不同。