如何在 XSLT 中将 XML 转换为 Json?

How to convert XML to Json in XSLT?

如何在 xslt

中将 xml 转换为 json

输入xml:

<root>
    <citiID>RR1</citiID>
    <bib>ertyokf (5208). Free <Emphasis Type="Italic">of detachment</Emphasis>, aedrtg. dcdcdr<b>49</b> any text</bib>
</root>

预计Json:

  "root": [
    {
        "citeid": "RR1",
        "bib": "ertyokf (5208). Free <Emphasis Type=\"Italic\">of detachment</Emphasis>, aedrtg. dcdcdr<b>49</b> any text."
    },
    ]

如果您使用的是 xslt3,那么它有一个函数,xml-to-json ()

这里有解释:

也可以在 xslt1 和 2 中完成,但方法不同 - 您使用的是哪个版本?

您可以使用两种方法,一种是将您想要的 JSON 直接表示为 XDM 3.1 映射和数组:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    exclude-result-prefixes="#all"
    version="3.0">


  <xsl:output method="json" indent="yes"/>

  <xsl:template match="/*">
    <xsl:sequence
      select="map {
        local-name() : array {
          map:merge(* ! map {
            lower-case(local-name()) : serialize(node())
          })
        }
      }"/>
  </xsl:template>
  
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/naZYrpR/1

第二个是将您的输入 XML 转换为 xml-to-json 函数使用的 JSON 的 XML 表示。

请注意,XSLT 3.0 中的 xml-to-json() 函数并非设计用于处理任意 XML,它仅设计用于处理“XML 由 json-to-xml() 函数生成的 JSON" 的表示。

您有两个选择:要么将您的 XML 转换为映射和数组结构,然后将其序列化为 JSON,要么将其转换为 XML 词汇表 xml-to-json() 接受。

(您的示例很好地说明了这样做的原因,您在其中试图保留一些表示为标记的元素。现成的转换不会为您完成。)

另请注意:您的预期输出不是 JSON。它需要用花括号包围 JSON:还有一个逗号需要修复。

我会做:

<xsl:template match="root">
  <xsl:variable name="temp" as="map(*)" select="
     map{ "root": [
        map{ "citeID": string(citiID (:sic:)),
             "bib": serialize(bib/child::node(), map{"method":"xml", "omit-xml-declaration": true()}
        }]}"/>
  <xsl:value-of select="serialize($temp, map{"method":"json", "indent":true()})"/>
</xsl:template>  

未测试。