2017-08-11 167 views
0

我试图使用JSON对XML功能JSON数据转换为XML的XSLT 3.0,但并不如预期JSON在XSLT XML转换3.0

例如输入JSON产生的XML:

{ 
"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> 

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

你们能帮我实现这个吗?

回答

1

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

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> 

但某些规则似乎是特别的词汇,例如我不明白你为什么处理GlossSeetitle不同。

+0

Thankyou Michael,这完全解决了我的问题。 – PhanidharSwarna

+0

这怎么可能导致xml可以用于进一步转换例如我试图应用下面的代码后上述模板,但无法得到任何结果 \t \t的 \t \t \t的 \t \t的 \t \t \t \t \t PhanidharSwarna

+0

请提出一个新问题,不要提出补充问题作为对答案的评论。 (并且不要将代码放在评论中,它不可读。) –