当前位置: 首页 > 知识库问答 >
问题:

使用XSLT 3.0转换XML

牧献
2023-03-14

我想使用XSLT将一些XML转换为JSON。XML如下所示:

<?xml version="1.0" ?>
<CoronaInfections>
    <Countries>
        <item>
            <Country>Afghanistan</Country>
            <CountryCode>AF</CountryCode>
            <Slug>afghanistan</Slug>
            <NewConfirmed>542</NewConfirmed>
            <TotalConfirmed>21459</TotalConfirmed>
            <NewDeaths>15</NewDeaths>
            <TotalDeaths>384</TotalDeaths>
            <NewRecovered>480</NewRecovered>
            <TotalRecovered>2651</TotalRecovered>
            <Date>2020-06-10T10:06:56Z</Date>
            <Lat>33.0000</Lat>
            <Lng>65.0000</Lng>
        </item>
        <item>
            <Country>Albania</Country>
            <CountryCode>AL</CountryCode>
            <Slug>albania</Slug>
            <NewConfirmed>36</NewConfirmed>
            <TotalConfirmed>1299</TotalConfirmed>
            <NewDeaths>0</NewDeaths>
            <TotalDeaths>34</TotalDeaths>
            <NewRecovered>15</NewRecovered>
            <TotalRecovered>960</TotalRecovered>
            <Date>2020-06-10T10:06:56Z</Date>
            <Lat>41.0000</Lat>
            <Lng>20.0000</Lng>
        </item>
        <item>
            <Country>Algeria</Country>
            <CountryCode>DZ</CountryCode>
            <Slug>algeria</Slug>
            <NewConfirmed>117</NewConfirmed>
            <TotalConfirmed>10382</TotalConfirmed>
            <NewDeaths>9</NewDeaths>
            <TotalDeaths>724</TotalDeaths>
            <NewRecovered>152</NewRecovered>
            <TotalRecovered>6951</TotalRecovered>
            <Date>2020-06-10T10:06:56Z</Date>
            <Lat>28.0000</Lat>
            <Lng>3.0000</Lng>
        </item>
   </Countries>
</CoronaInfections>

我希望JSON如下所示:

{ "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
                "properties": {
                "radius": 1.0841103742476927, 
                "id": "AF", 
                "countryName": "Afghanistan" 
            },
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [33.0000, 65.0000]
                },
        },
        {
            "type": "Feature",
                "properties": {
                "radius": 0.06562558255966042, 
                "id": "AL", 
                "countryName": "Albania" 
            },
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [41.0000, 20.0000]
                },
        },
    ]
}

推荐的方法是什么?

我已经有了一个方法,它看起来不太好,因为它只适用于xslt 1.0(我认为)和文本块。请参阅此处:https://xsltfiddle.liberty-development.net/naZYrpy/1

我更喜欢使用xslt 3.0和xml to json函数的更有效方法,但似乎不可能添加额外的json对象。

更多示例:1。不工作:https://xsltfiddle.liberty-development.net/pNmCzsA

不工作:https://xsltfiddle.liberty-development.net/ejivdGS/4

不工作:https://xsltfiddle.liberty-development.net/bFWR5DQ/17

提前感谢:-)

共有1个答案

强保臣
2023-03-14

如果您想直接使用XPath 3.1创建XDM映射和数组,并将其序列化为JSON,请使用

 <xsl:sequence
    select="map { 'type' : 'FeatureCollection',
                  'Features' : array {
                    //item ! (
                      map {
                        'type' : 'Feature',
                        'properties' : map {
                          'radius' : TotalConfirmed div $max * 100,
                          'id' : data(CountryCode),
                          'countryName' : data(Country)
                        }
                      },
                      map {
                        'type' : 'Feature',
                        'geometry' : map {
                          'type' : 'Point',
                          'coordinates' : [number(Lat), number(Lng)]
                        }
                      }
                    )}
                }"/>

https://xsltfiddle.liberty-development.net/a9HjZi

请注意,像Javascript对象这样的XDM映射没有任何有序的属性集合,因此您可以这样定义序列化顺序,Saxon 9和10的商业版本为此提供了扩展。

或者您需要将输入XML转换为XML格式,即XML to json函数exepcts,它将XML输入中元素的顺序表示为json序列化的输出顺序:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/2005/xpath-functions"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:output method="text"/>

  <xsl:variable name="max" select="max(//item/*[starts-with(local-name(), 'TotalConfirmed')]/xs:integer(.))"/>

  <xsl:template match="/">
     <xsl:variable name="xml-to-json-input">
         <map>
             <string key="type">FeatureCollection</string>
             <array key="features">
                 <xsl:apply-templates select="//item"/>
             </array>
         </map>
     </xsl:variable>

     <xsl:value-of select="xml-to-json($xml-to-json-input, map { 'indent' : true() })"/>
  </xsl:template>

  <xsl:template match="item">
      <map>
          <string key="type">Feature</string>
          <map key="properties">

              <number key="radius">{TotalConfirmed div $max * 100}</number>
              <string key="id">{CountryCode}</string>
              <string key="countryName">{Country}</string>
          </map>
      </map>
      <map>
          <string key="type">Feature</string>
          <map key="geometry">
              <string key="type">Point</string>
              <array key="coordinates">
                  <number>{number(Lat)}</number>
                  <number>{number(Lng)}</number>
              </array>
          </map>
      </map>
  </xsl:template>


</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/a9HjZi/2

 类似资料:
  • 我能够在Java中使用XSLT1.0,如以下示例所示:- copy.xml copy.xsl copy.java 输出

  • 我用于处理和文件的一般java代码是: 我必须处理3.0版本的才能使用以下函数: parse-xml-fragment() 预期产出: 谁能提供一个解决方案吗?

  • XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输

  • 问题内容: 我想使用xsl文件转换一些xml并以某种方式输出结果(我使用的是Android Api Level 8)。 我当前的活动看起来像这样,但是转换器保持为空。LogCat引发一个with ,表示xml格式不正确,但是我确定它是正确的。 我在LogCat中发现了一条提示,提示在上述错误消息之前。 我究竟做错了什么? 这是要转换的xml文件(source.xml) 这是对应的xsl(produ

  • 问题内容: 您将如何从XML转换为JSON,然后再转换回XML? 以下工具可以很好地工作,但并不完全一致: xml2json 有人遇到过这种情况吗? 问题答案: 我认为这是最好的方法: 在XML和JSON之间转换 一定要阅读xml.com O’Reilly网站上的随附文章,该文章详细介绍了这些转换所带来的问题,我认为您会发现这很有启发性。O’Reilly托管该文章的事实应表明,Stefan的解决方

  • 我想将XMl转换为另一种XMl格式。假设我在ats中有一个逻辑。埃姆沃。使改变TransformXml java文件如何集成以在camel上下文输入中转换tis(file:///d:/in)是xml文件,我想将其另存为xml。我已经将此文件作为bean类添加到camel