我有一个非常大的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>	</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 -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文件。 - 任何指针和子标题或代码片段都非常受欢迎。问候你的零
答案 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
。