使用XSLT 1.0版从JSON文件中提取信息

use*_*609 6 gis xslt json xslt-1.0

我是stackoverflow和xslt的noobie所以我希望我听起来不愚蠢!

所以我正在为一家GIS公司的SDI工作,我有一项任务要求我将一个空间参考系统(SRS)坐标平面上的点(例如EPSG:4035)转换为世界SRS,即EPSG:4326.这对我来说真的不是问题,因为我有一个在线服务的可访问性,只会给我我想要的东西.但是,它输出的格式是JSON或HTML.我已经浏览了一段时间来找到从JSON文件中提取信息的方法,但我见过的大多数技术都使用xslt:stylesheet 2.0版,我必须使用1.0版.我想做的一个方法是使用文档($ urlWithJsonFormat)xslt函数,但是这只接受xml文件.

以下是我要求转换后将检索的JSON格式文件的示例:

{
  "geometries" : 
  [{
      "xmin" : -4, 
      "ymin" : -60, 
      "xmax" : 25, 
      "ymax" : -41
    }
  ]
}

我只想要的是xmin,ymin,xmax和ymax值,这就是全部!它看起来很简单,但对我来说没有任何作用......

Mad*_*sen 5

您可以使用外部实体将 JSON 数据作为 XML 文件的一部分包含进来,然后进行转换。

例如,假设示例 JSON 保存为名为“geometries.json”的文件,您可以创建一个如下所示的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wrapper [
<!ENTITY otherFile SYSTEM "geometries.json">
]>
<wrapper>&otherFile;</wrapper>
Run Code Online (Sandbox Code Playgroud)

然后使用以下 XSLT 1.0 样式表对其进行转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="wrapper">
    <geometries>
        <xsl:call-template name="parse-json-member-value">
            <xsl:with-param name="member" select="'xmin'"/>
        </xsl:call-template>
        <xsl:call-template name="parse-json-member-value">
            <xsl:with-param name="member" select="'ymin'"/>
        </xsl:call-template>
        <xsl:call-template name="parse-json-member-value">
            <xsl:with-param name="member" select="'xmax'"/>
        </xsl:call-template>
        <xsl:call-template name="parse-json-member-value">
            <xsl:with-param name="member" select="'ymax'"/>
        </xsl:call-template>
    </geometries>
</xsl:template>

    <xsl:template name="parse-json-member-value">
        <xsl:param name="member"/>
        <xsl:element name="{$member}">
            <xsl:value-of select="normalize-space(
                                    translate(
                                        substring-before(
                                            substring-after(
                                                substring-after(.,
                                                    concat('&quot;', 
                                                           $member, 
                                                          '&quot;'))
                                                , ':')
                                            ,'&#10;')
                                    , ',', '')
                                  )"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

<geometries>
   <xmin>-4</xmin>
   <ymin>-60</ymin>
   <xmax>25</xmax>
   <ymax>-41</ymax>
</geometries>
Run Code Online (Sandbox Code Playgroud)


小智 1

这里的两个主要选择似乎是:

  1. 在 XSLT 1.0 中编写(或使用)JSON 解析器,或者
  2. 使用 XSLT 以外的其他语言。

由于 XSLT 1 引擎通常无法直接处理 JSON,因此我建议使用其他语言来转换为 XML。

如果这是 Web 浏览器中的 XSLT,https://github.com/WelcomWeb/JXS也可能对您有帮助。