0

地理情報学の分野から派生した非常に大きな 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>&#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="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 またはコード スニペットは大歓迎です。こんにちは、あなたのゼロ

4

1 に答える 1

2

コンテキストノードは元の一致する要素であり、要素ではないため、 ./tag[@k = '???']/@vxpathはである必要があるように見えます。../tag[@k='???']tagnode

このコードをより明確にし、次のようなエラーを回避するために、コンテキストノードを変更することを検討する必要があります。

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

select="tag/@id"次に、やのようなXPathを使用できますtag[@k='country']/@v

templateただし、の代わりにをより有効に活用するために、このコードをリファクタリングすることを検討する必要がありfor-eachます。

于 2012-04-23T20:14:30.270 に答える