xslt-processor仅返回请求/匹配标记的一小部分

时间:2012-04-23 19:41:59

标签: mysql xml parsing xslt openstreetmap

我有一个非常大的xml文件 - 来自地理信息学领域。我从一个德国子网站或OpenStreetMap-Project获得它:Geograpical-Engineering网站,它取消了某个区域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

我用xml_split分割文件 - 这是CPAN的一个很棒的perl模块。

问题:使用以下xslt-processor我只得到不好的结果 - 解析后的文件没有被解析得足够我在xml文件上运行代码时只得到一小部分信息。看到xslt-processor - 及以下 - 我运行的文件中的一个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 germany-001.xml&gt;餐馆-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 -processor中的标签 - 任何想法和暗示将非常感激

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

我必须重构这个男女同校 - 所以问题是 - 我怎样才能以有效的方式获得mysql结果?

* 更新: * thx到这个线程的第一个答案我重新开始重构代码 - 但仍然缺乏一些更好的结果。我必须再次重试。有很多变化被建议 - 我在xslt-parser上做了一个快速的漫步:第一次重构试验我得到了一些有趣的结果。但我会再试一次 - 我会通过所有xslt处理器代码,仔细看看我是否找到错误,最后我尝试重构所有的xslt文件。 - 任何指针和子标题或代码片段都非常受欢迎。问候你的零

1 个答案:

答案 0 :(得分:2)

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

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

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

然后您可以使用select="tag/@id"tag[@k='country']/@v之类的XPath。

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