XSLT 3.0 中的 JSON 到 XML 转换

2024-02-04

我正在尝试使用 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>

我的主要问题是忽略这些关键属性,并将属性(键)值打印为元素名称,将实际文本打印为元素文本。

你们能帮我实现这个目标吗?


您的“预期”输出似乎并不基于对规范的任何阅读:

https://www.w3.org/TR/xslt-30/#json-to-xml-mapping https://www.w3.org/TR/xslt-30/#json-to-xml-mapping

这个想法是,您获得的 XML 无损地捕获 JSON 中的所有内容;您可以轻松地将其转换为您想要的形式,然后您可以做出自己的决定,例如,处理不是有效 XML 元素名称的 JSON 键,或者何时使用元素以及何时使用属性。

您可以通过一些简单的规则获得大部分您想要的东西,例如:

<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.

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

XSLT 3.0 中的 JSON 到 XML 转换 的相关文章

随机推荐