2012-04-23 20 views
0

我有一個非常大的XML文件的一個小的子集 - 這是從地理信息學領域的。我從德國子網站或OpenStreetMap-Project獲得:Geograpical-Engineering-site,它提供某個區域的OpenStreetMap的每週快照:我從這裏獲取germany.osm.bz2 http://ftp5.gwdg.de/pub/misc/openstreetmap/download.geofabrik.de/XSLT處理器還給只請求/匹配的標籤

對於做一些測試與xslt我想運行一個請求找出某個實體 - 讓我們舉例來說餐廳。我們想找出該地區的所有餐館。

現在我們可以在BZ2壓縮文件,直接運行,我們下載的 - 例如,如果我們使用下面的代碼:

bzcat germany.osm.bz2 | xsltproc restaurants.xslt - > restaurants,csv 

以及我與分裂的xml_split文件哪位是一個偉大的perl-來自CPAN的模塊。

問題:與下面的xslt處理器我只得到不好的結果 - 解析的文件werent沒有足夠的分析我只有一小部分信息時,我運行在xml文件上的代碼。看到xslt處理器 - 下面 - 一個litte數據塊出我的文件運行和解析,如果你想檢查它 - 只是得到小數據集 - 注意這是一個拆分文件

在這裏你可以得到它:https://rapidshare.com/#!download|643p12|2523227518|germany-001.xml|100000

注:參見因此,重要線路:xmlns:xml_split="http://xmltwig.com/xml_split" 而這一次在這裏:

<xsl:for-each select="xml_split:root/node/tag[@k='amenity' and @v='restaurant']"> 

注意 - 你可以運行一個小測試 - 看看需要多長時間來解析 時間在xsltproc restaurants.xslt德國Y型001.xml>餐館 - 001.csv

real 0m0.308s 
user 0m0.283s 
sys  0m0.022s 

這裏我們有XSLT處理器包含代碼解析 - (稱爲atest3.xslt )

<xsl:stylesheet version = '1.0' 
     xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:xml_split="http://xmltwig.com/xml_split" 
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 

    <xsl:output method="text" encoding="UTF-8"/> 
    <xsl:template match="/"> 

      <xsl:for-each select="xml_split:root/node/tag[@k='amenity' and @v='restaurant']"> 
      <xsl:value-of select="../@id"/> 
      <xsl:text>&#x09;</xsl:text> 
      <xsl:value-of select="../@lat"/> 
      <xsl:text>&#x09;</xsl:text> 
      <xsl:value-of select="../@lon"/> 
      <xsl:text>&#x09;</xsl:text> 
      <xsl:for-each select="../tag[@k='name']"> 
       <xsl:value-of select="@v"/> 
      </xsl:for-each> 
      <xsl:text>&#x0A;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'cuisine']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'wheelchair']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'website']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'addr:country']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'addr:city']/@v"/> 
     <xsl:text>&#x09;</xsl:text>   
     <xsl:value-of select="./tag[@k = 'addr:street']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'addr:housenumber']/@v"/> 
     <xsl:text>&#x0A;</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

,在這裏我們下面有一個數據塊從XML文件中,我們已經解析:看到它

<node id="52768810" lat="48.2044749" lon="11.3249434" version="7" changeset="9490517" user="wheelmap_visitor" uid="290680" timestamp="2011-10-07T20:24:46Z"> 
    <tag k="addr:city" v="Olching" /> 
    <tag k="addr:country" v="DE" /> 
    <tag k="addr:housenumber" v="72" /> 
    <tag k="addr:postcode" v="82140" /> 
    <tag k="addr:street" v="Hauptstraße" /> 
    <tag k="amenity" v="restaurant" /> 
    <tag k="cuisine" v="mexican" /> 
    <tag k="email" v="[email protected]" /> 
    <tag k="name" v="La Cantina" /> 
    <tag k="opening_hours" v="Mo-Su 17:00-01:00" /> 
    <tag k="phone" v="+49 (8142) 444393" /> 
    <tag k="website" v="http://www.cantina-olching.com/" /> 
    <tag k="wheelchair" v="no" /> 
</node> 

看到的結果 - 注意,少了一些部件 - 不幸的是..

51923772 49.0812534 8.5637183 Zur Talschänke 

52040576 49.4635433 12.4287292 Emil-Kemmer-Haus 

52141326 49.4144243 12.4143153 Gasthaus Plecher 

52623232 48.9293634 8.2722549 Korfu 

52664989 49.0435133 8.3919370 Restaurant Zentrum 

52754898 49.3243828 12.3618662 Gasthaus Irlbacher 

52762875 49.0099641 8.2528132 Langasthof Stober 

52765672 50.0082768 9.2139632 Wirtshaus im Frohnrad 

52768810 48.2044749 11.3249434 La Cantina 

52768816 48.2051698 11.3257964 Indian Palace 

52768826 48.2073264 11.3276147 Dorfstub'n 

52768830 48.2075968 11.3281055 Le Candele 

52774284 49.0319471 8.2888353 Zum Anker 

以及它是有點問題,我得到的結果 - 我嘗試了很多,但此刻我無縫爲什麼我得到了小輸出 - 這是完全相反的標籤我在xslt處理器 - 任何想法和提示將大大升值

btw:畢竟我想運行大約5000個文件,這是分裂的結果 - 隨後我想收集所有結果在mysql數據庫中...

在這裏你可以得到original-file: http://ftp5.gwdg.de/pub/misc/openstreetmap/download.geofabrik.de(germany.osm.bz2 01- Apr-2012 14:51 1。7G)

和這裏分裂之一: https://rapidshare.com/#!download|643p12|2523227518|germany-001.xml|100000

我必須重構男女同校 - 所以這個問題 - 是 - 我怎樣才能得到一個有效的方式使用mysql-結果?

* 更新: * thx到這個線程中的第一個答案我開始重構代碼 - 但仍然缺乏一些更好的結果。我不得不再次嘗試一次。我提出了一些改變 - 我在xslt解析器上做了一個快速的步驟:在重構的第一個試驗中,我得到了一些有趣的結果。但我會再試一次 - 如果我找到錯誤並最終嘗試重構所有xslt文件,我會遍歷所有xslt處理器代碼並仔細查看。 - 任何指針和子問題或代碼片段都非常好。問候你的零

回答

2

它看起來像你的./tag[@k = '???']/@v XPath的應該是../tag[@k='???'],因爲你的上下文節點是你原來的匹配tag元素,而不是node元素。

你應該考慮改變你的上下文節點,使這個代碼更清晰,並避免象這樣的錯誤:

<xsl:for-each select="xml_split:root/node[tag[@k='amenity' and @v='restaurant']]"> 

然後你可以使用的XPath像select="tag/@id"tag[@k='country']/@v

但是您應該考慮重構此代碼以更好地使用template而不是for-each

+0

你好親愛的弗朗西斯阿維拉 - 非常感謝提示 - 很高興看到如此巨大的幫助,我儘量按照你的意見。 Greetings – zero 2012-04-23 20:40:37

+0

你提出的很多改變 - 我在xslt解析器上做了一個快速的步驟:在重構的第一個試驗中,我得到了一些有趣的結果。但我會再試一次 - 如果我找到錯誤並最終嘗試重構所有xslt文件,我會遍歷所有xslt處理器代碼並仔細查看。 - 任何指針和子問題或代碼片段都非常好。問候你的零 – zero 2012-04-23 21:07:33

+0

你好弗朗西斯 - 你好@所有 - 可以。給**一些**幫助** **重構**代碼!?這將是一個很大的幫助。多謝 – zero 2012-04-24 06:32:01