1

我正在尝试使用 json-to-xml 函数在 XSLT 3.0 中将 JSON 数据转换为 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>

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

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

4

1 回答 1

3

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

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.

于 2017-08-11T11:10:36.283 回答