【问题标题】:extracting information from a JSON file using XSLT version 1.0使用 XSLT 1.0 版从 JSON 文件中提取信息
【发布时间】:2012-08-24 15:52:14
【问题描述】:

我是 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, “最大”:25, “最大”:-41 } ] }

我只想要 xmin、ymin、xmax 和 ymax 值,仅此而已!它看起来很简单,但对我没有任何作用......

【问题讨论】:

  • XSLT 1.0 确实是一个错误的工具。它需要 XML 作为其(主要)输入。正如其他人指出的那样,您可以找到传入非 XML 的方法,但它们很尴尬。是否有必须使用 XSLT 的理由?
  • 毕竟,XSLT 中的 X 代表 XML。您正试图在这里用锤子敲打螺丝。
  • 你能升级到 XSLT 2.0 吗?它会让你的事情变得更容易。
  • 没有。大多数 XSLT 1.0 处理器都可以接受文本输入,或者通过应用于参数值的 document() 函数,或者直接通过参数。
  • 根据您的 XSLT 处理器,您可以通过样式表参数传入整个 jason 字符串。你的处理器是什么?是服务器端还是客户端?

标签: json xslt gis xslt-1.0


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以使用external entity 将 JSON 数据作为 XML 文件的一部分包含在内,然后进行转换。

    例如,假设示例 JSON 保存为名为“geometries.json”的文件,您可以像这样创建 XML 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE wrapper [
    <!ENTITY otherFile SYSTEM "geometries.json">
    ]>
    <wrapper>&otherFile;</wrapper>
    

    然后使用以下 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>
    

    产生以下输出:

    <geometries>
       <xmin>-4</xmin>
       <ymin>-60</ymin>
       <xmax>25</xmax>
       <ymax>-41</ymax>
    </geometries>
    

    【讨论】:

    • 不错的答案。您可以更进一步,甚至不需要构造的包装文档。可以使用 document() 函数直接从 jason 文件中获取文本输入,并通过参数传入 jason 文档。
    • @SeanB.Durkin:您确定document() 可以访问XSLT 1.0 中的非XML 文档吗? w3.org/TR/xslt#function-document "文档功能允许访问除主要源文档之外的 XML 文档。"
    • @LarsH 我的错。我在想未解析的文本()。虽然这是一个 XSLT 2.0 功能,但它应该可以通过 exslt 支持 XSLT 1.0 处理器。
    • 虽然包装技术很简单而且很有效,但需要注意边缘情况。如果直接包装文本,则需要对文本进行 XML 文本编码,否则
    • @LarsH - 也可以引用托管 JSON 的 URL,而不是先下载本地文件。即&lt;!ENTITY otherFile SYSTEM "http://example.com/geometries.json"&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多