我是stackoverflow和xslt的新手,所以我希望我听起来不会不聪明!
因此,我正在为一家GIS公司与SDI合作,我有一项任务需要我将位于一个空间参考系(SRS)坐标平面中的点(如EPSG:4035)转换为世界SRS,即EPSG:4326。这对我来说真的不是问题,因为我可以访问在线服务,它只会给我想要的东西。但是,它输出的格式是JSON或HTML。我浏览了一段时间,想找到一种从JSON文件中提取信息的方法,但我看到的大多数技术都使用xslt:stylesheet 2.0版本,我必须使用1.0版本。我考虑过的一种方法是使用document($urlWithJsonFormat)xslt函数,但它只接受xml文件。
下面是一个JSON格式的文件示例,我将在请求转换后检索该文件:
{"几何图形":[{"xmin":-4,"ymin":-60,"xmax":25,"ymax":-41}]}
我只想要xmin、ymin、xmax和ymax值,仅此而已!它看起来很简单,但对我来说什么都不起作用…
您可以使用外部实体将JSON数据作为XML文件的一部分,然后对其进行转换。
例如,假设示例JSON保存为一个名为"geometry.JSON"的文件,您可以创建一个XML文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wrapper [
<!ENTITY otherFile SYSTEM "geometries.json">
]>
<wrapper>&otherFile;</wrapper>
然后使用以下XSLT1.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('"',
$member,
'"'))
, ':')
,' ')
, ',', '')
)"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
产生以下输出:
<geometries>
<xmin>-4</xmin>
<ymin>-60</ymin>
<xmax>25</xmax>
<ymax>-41</ymax>
</geometries>
这里的两个主要选择似乎是:
- 在XSLT1.0中编写(或使用)JSON解析器,或者
- 使用XSLT以外的其他语言
由于XSLT1引擎通常不能直接处理JSON,我建议使用其他语言转换为XML。
https://github.com/WelcomWeb/JXS如果这是Web浏览器中的XSLT,也可能对您有所帮助。