JSON以XML转换在XSLT 3.0(JSON to XML transformation in

2019-09-26 00:18发布

我试图JSON数据转换为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"
            }
        }
    }
}

}

生成的XML从XSLT3.0:

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

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

你们可以帮我实现这一目标。

Answer 1:

您的“预期”输出似乎不立足于规范的任何阅读:

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 transformation in XSLT 3.0
标签: xslt xslt-3.0