6

私はstackoverflowとxsltの初心者なので、賢くないように聞こえないことを願っています!

そのため、私はGIS会社のSDIを使用しており、EPSG:4035などの1つの空間参照系(SRS)座標平面にあるポイントを世界のSRS、別名EPSG:4326に変換する必要があるタスクがあります。私は自分が欲しいものを提供するだけのオンラインサービスにアクセスできるので、これは私にとって本当に問題ではありません。ただし、出力される形式はJSONまたはHTMLのいずれかです。JSONファイルから情報を抽出する方法を見つけるためにしばらく閲覧しましたが、これまでに見た手法のほとんどはxslt:stylesheetバージョン2.0を使用しており、バージョン1.0を使用する必要があります。私が考えた方法の1つは、document($ urlWithJsonFormat)xslt関数を使用することでしたが、これはxmlファイルのみを受け入れます。

変換を要求した後に取得するJSON形式のファイルの例を次に示します。

{{
  「ジオメトリ」:
  [{
      "xmin":-4、
      「ymin」:-60、
      「xmax」:25、
      「ymax」:-41
    }
  ]
}

必要なのは、xmin、ymin、xmax、およびymaxの値だけです。これですべてです。とてもシンプルに見えますが、私には何も機能しません...

4

2 に答える 2

4

外部エンティティを使用して、後で変換する XML ファイルの一部として JSON データを含めることができます。

たとえば、サンプルの 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>
于 2012-08-30T02:37:44.683 に答える
1

ここでの2つの主な選択肢は次のようです。

  1. XSLT 1.0 で JSON パーサーを作成 (または使用) するか、または
  2. XSLT 以外の言語を使用します。

XSLT 1 エンジンは一般に JSON を直接処理できないため、他の言語を使用して XML に変換することをお勧めします。

これが Web ブラウザーの XSLT である場合は、 https://github.com/WelcomWeb/JXSも役立つ場合があります。

于 2012-08-30T02:28:01.667 に答える