0

我有一个非常大的 xml 文件——它来自地理信息学领域。我从一个德国子站点或 OpenStreetMap-Project 获得它:Geograpical-Engineering-site,它提供了某个区域的 OpenStreetMap 的每周快照:我从这里http://ftp5.gwdg.de获取了 Germany.osm.bz2 /pub/misc/openstreetmap/download.geofabrik.de/

为了用 xslt 做一些测试,我想运行一个请求来找出某个实体——让我们以餐馆为例。我们想找出该地区所有的餐馆。

现在我们可以直接在我们下载的 bz2 压缩文件上运行它——例如,如果我们使用以下代码:

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

好吧,我用 xml_split 拆分了文件——这是来自 CPAN 的一个很棒的 perl 模块。

问题:使用以下 xslt 处理器,我只得到不好的结果 - 解析的文件没有得到足够的解析,当我在 xml 文件上运行代码时,我只得到一小部分信息。查看 xslt 处理器 - 及以下 - 如果你想检查它,我运行并解析文件中的一个小数据块 - 只需获取小数据集 - 注意它是一个拆分文件

在这里你可以得到它: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 Germany-001.xml > Restaurants-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="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 - 处理器中的标签完全相反 - 任何想法和提示都会是非常感谢dd

顺便说一句:毕竟我想运行大约 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?

*更新: *感谢此线程中的第一个答案,我开始重构代码-但仍然缺乏一些更好的结果。我必须再试一次.. 建议进行很多更改 - 我在 xslt-parser 上做了一个快速演练:在第一次尝试重构时,我得到了一些有趣的结果。但我会再试一次——我会检查所有的 xslt 处理器代码,如果发现错误,我会仔细查看,最后我会尝试重构所有 xslt 文件。- 任何指针和 subbestions 或代码片段都非常受欢迎。问候你的零

4

1 回答 1

2

看起来您的./tag[@k = '???']/@vxpath 应该是../tag[@k='???'],因为您的上下文节点是您的原始匹配tag元素,而不是node元素。

您应该考虑更改上下文节点以使此代码更清晰并避免如下错误:

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

然后您可以使用 XPathselect="tag/@id"tag[@k='country']/@v.

但是您应该考虑重构此代码以更好地使用template代替for-each.

于 2012-04-23T20:14:30.270 回答