地理情報学の分野から派生した非常に大きな xml ファイルがあります。私はドイツのサブサイトまたは OpenStreetMap プロジェクトから入手しました: 特定の地域の OpenStreetMap の毎週のスナップショットを提供する地理工学サイト: ここから germany.osm.bz2 を取得しましたhttp://ftp5.gwdg.de /pub/misc/openstreetmap/download.geofabrik.de/
xslt でいくつかのテストを行うために、特定のエンティティを見つけるためのリクエストを実行したいと考えています。たとえば、レストランを取り上げてみましょう。その地域のすべてのレストランを見つけたいと思っています。
これで、ダウンロードした bz2 圧縮ファイルで直接実行できます。たとえば、次のコードを使用するとします。
bzcat germany.osm.bz2 | xsltproc restaurants.xslt - > restaurants,csv
CPAN の優れた perl モジュールである xml_split でファイルを分割しました。
問題:次の xslt-processor では、悪い結果しか得られません。解析されたファイルは十分に解析されていませんでした。xml ファイルでコードを実行すると、マイナーな情報セットしか取得できません。xslt-processor を参照してください - 以下 - ファイルから小さなデータチャンクを実行し、確認したい場合は解析します - 小さなデータセットを取得するだけです - 分割されたファイルであることに注意してください
ここで入手できます: 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 restaurant.xslt germany-001.xml > restaurants-001.csv
real 0m0.308s
user 0m0.283s
sys 0m0.022s
ここには、解析用のコードを含む xslt-processor があります - ( 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>	</xsl:text>
<xsl:value-of select="../@lat"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="../@lon"/>
<xsl:text>	</xsl:text>
<xsl:for-each select="../tag[@k='name']">
<xsl:value-of select="@v"/>
</xsl:for-each>
<xsl:text>
</xsl:text>
<xsl:value-of select="./tag[@k = 'cuisine']/@v"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="./tag[@k = 'wheelchair']/@v"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="./tag[@k = 'website']/@v"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="./tag[@k = 'addr:country']/@v"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="./tag[@k = 'addr:city']/@v"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="./tag[@k = 'addr:street']/@v"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="./tag[@k = 'addr:housenumber']/@v"/>
<xsl:text>
</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="info@cantina-olching.de" />
<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プロセッサにあるタグとはまったく反対です-アイデアとヒントは大変感謝しております
ところで:結局のところ、分割の結果である約5000個のファイルを実行したい-そしてその後、すべての結果をmysqlデータベースに収集したい...
ここで元のファイルを取得できます: 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
私はcoedをリファクタリングする必要があります-それで問題は-どうすれば効率的な方法でmysql-resultsを取得できますか?
*更新: * このスレッドの最初の回答への thx 私はコードのリファクタリングを開始しましたが、まだいくつかのより良い結果が得られていません。再試行する必要があります..多くの変更が提案されました.xslt-parserで簡単なウォークスルーを行いました.リファクタリングの最初の試行で、面白い結果が得られました. しかし、もう一度やり直します。すべての xslt-processor-code を調べて、エラーが見つかったら詳しく調べ、最後にすべての xslt ファイルをリファクタリングしようとします。- 任意のポインターと subbestions またはコード スニペットは大歓迎です。こんにちは、あなたのゼロ