2012-08-29 56 views
4

我是一個noover到stackoverflow和xslt所以我希望我不聽起來不聰明!使用XSLT版本1.0從JSON文件中提取信息

因此,我正在與SDI合作爲一家GIS公司工作,我有一項任務需要我將位於一個空間參考系(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值,這就是全部!它似乎很簡單,但對我來說沒有任何作用...

+1

可以升級到XSLT 2.0?它會讓事情變得更容易。 –

+1

根據您的XSLT處理器,您可以通過樣式表參數傳遞整個jason字符串。你的處理器是什麼?它是服務器端還是客戶端? –

+0

應該是一個.NET處理器,切換到XSLT 2.0是不可能的。 – user1634609

回答

1

這裏的兩個主要選擇似乎是(1)在XSLT 1.0中編寫(或使用)JSON解析器,或者(2)使用除XSLT之外的其他語言。由於XSLT 1引擎通常不能直接處理JSON,我建議使用其他語言轉換爲XML。

https://github.com/WelcomWeb/JXS也可以幫助你,如果這是Web瀏覽器中的XSLT。

3

您可以使用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> 
+0

很好的答案。你可以更進一步,甚至不需要構造包裝文檔。文本輸入可以使用document()函數直接從jason文件中獲取,並使jason文檔通過參數傳入。 –

+1

@ SeanB.Durkin:你確定'document()'可以訪問XSLT 1.0中的非XML文檔嗎? http://www.w3.org/TR/xslt#function-document「文檔功能允許訪問主源文檔以外的XML文檔。」 – LarsH

+0

@Mads +1,很好的回答。如果他有機會將json下載並保存到一個文件中,以便外部實體能夠工作,那麼他也可以將它保存到具有XML包裝器的文件中;在這種情況下,即使是不處理DTD的XML解析器(因爲並非所有符合要求的XML解析器都需要這樣做,對嗎?)將能夠處理包裝的JSON。 – LarsH