在xslt-processor中添加新的xml元素 - 一个新手

时间:2012-04-21 14:52:01

标签: xml parsing xslt map openstreetmap

你好,亲爱的xml朋友,

我是xml的新手,所以不要忍受我的问题...我正在用xslt处理器进行一些测试 -

新:查看我在此初始发布时添加的更新 - 对于解决方案,我复制了标记名称的逻辑... - >我在初始发布结束时添加了一个示例。 plz lemme知道你的idas ...... thgx

<xsl:stylesheet version = '1.0'
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

    <xsl:output method="text" encoding="UTF-8"/>
    <xsl:template match="/">

        <xsl:for-each select="/osm/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:for-each>
<xsl:for-each select="../tag[@k='website']">
    <xsl:value-of select="@v"/>
    </xsl:for-each>
    <xsl:text>&#x0A;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

注意:上述解决方案并未提供任何附加信息 - 因此网站未显示。这里有什么问题!?

这里开始初始发布。

我在终端上运行它来解析xml文档

问题:我想要的是使用以下标记放大xslt-processor

wheelchair
website    
addr:country
addr:street
addr:city
addr:housenumber
  • 在此处的示例中查看更多详细信息......:

                                           

我运行以下代码:time xsltproc test3.xslt testdoc3.xml&gt;餐馆-004.csv

<xsl:stylesheet version = '1.0'
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

    <xsl:output method="text" encoding="UTF-8"/>
    <xsl:template match="/">

        <xsl:for-each select="/osm/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:for-each>
    </xsl:template>
</xsl:stylesheet>

.... 此xml-document - 名为 testdoc3.xml

<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="Osmosis SNAPSHOT-r26564">
  <node id="185612117" version="5" timestamp="2011-01-08T19:23:43Z" uid="290680" user="wheelmap_visitor" changeset="6906586" lat="48.8037523" lon="9.5248779">
    <tag k="addr:postcode" v="73614"/>
    <tag k="wheelchair" v="yes"/>
    <tag k="website" v="http://www.courage-restaurant.de/"/>
    <tag k="addr:country" v="DE"/>
    <tag k="name" v="Courage"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="addr:street" v="Künkelinstraße"/>
    <tag k="addr:city" v="Schorndorf"/>
    <tag k="addr:housenumber" v="33"/>
  </node>
  <node id="252619189" version="5" timestamp="2011-01-08T19:21:43Z" uid="290680" user="wheelmap_visitor" changeset="6906586" lat="48.8067032" lon="9.5314986">
    <tag k="addr:postcode" v="73614"/>
    <tag k="wheelchair" v="yes"/>
    <tag k="website" v="www.kesselhaus-schorndorf.de"/>
    <tag k="addr:country" v="DE"/>
    <tag k="name" v="Kesselhaus"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="addr:street" v="Arnoldstraße"/>
    <tag k="addr:city" v="Schorndorf"/>
    <tag k="addr:housenumber" v="3"/>
  </node>
  <node id="319597380" version="1" timestamp="2008-12-17T21:13:15Z" changeset="444629" lat="48.8277913" lon="9.5477029">
    <tag k="name" v="Gasthaus zur Linde"/>
    <tag k="amenity" v="restaurant"/>
  </node>
  <node id="319597382" version="1" timestamp="2008-12-17T21:13:15Z" changeset="444629" lat="48.8282523" lon="9.5503109">
    <tag k="name" v="China-Garden"/>
    <tag k="amenity" v="restaurant"/>
  </node>
  <node id="339591124" version="2" timestamp="2011-09-22T17:33:36Z" uid="290680" user="wheelmap_visitor" changeset="9366746" lat="48.7888015" lon="9.5079525">
    <tag k="cuisine" v="italian"/>
    <tag k="wheelchair" v="limited"/>
    <tag k="name" v="Pizzeria da Rocco"/>
    <tag k="amenity" v="restaurant"/>
  </node>
  <node id="392682646" version="3" timestamp="2010-05-11T19:00:20Z" uid="12973" user="MattGPS" changeset="4671372" lat="48.8315734" lon="9.5468864">
    <tag k="name" v="Gasthaus an der Wieslauf"/>
    <tag k="amenity" v="restaurant"/>
  </node>
  <node id="454516720" version="4" timestamp="2010-12-11T15:30:21Z" uid="12982" user="Michael Schulze" changeset="6625571" lat="48.8031264" lon="9.5344371">
    <tag k="addr:postcode" v="73614"/>
    <tag k="cuisine" v="regional"/>
    <tag k="website" v="http://www.deutscheshaus-schorndorf.de/"/>
    <tag k="addr:country" v="DE"/>
    <tag k="name" v="Deutsches Haus"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="addr:street" v="Sonnenscheinstraße"/>
    <tag k="addr:city" v="Schorndorf"/>
    <tag k="addr:housenumber" v="13"/>
  </node>
  <node id="572362430" version="3" timestamp="2010-07-04T06:59:50Z" uid="106522" user="neuntoeter" changeset="5130101" lat="48.807953" lon="9.5379673">
    <tag k="smoking" v="no"/>
    <tag k="name" v="Club Kneipe"/>
    <tag k="amenity" v="restaurant"/>
  </node>
  <node id="613988559" version="1" timestamp="2010-01-15T01:20:03Z" uid="24748" user="mabapla" changeset="3621550" lat="48.7991827" lon="9.551828">
    <tag k="name" v="Gaststätte Schützenhaus"/>
    <tag k="amenity" v="restaurant"/>
  </node>
  <node id="859532091" version="1" timestamp="2010-08-13T23:05:14Z" uid="130472" user="fx99" changeset="5486736" lat="48.8062337" lon="9.5278548">
    <tag k="website" v="http://www.weinstube-buechsenmacher.de/"/>
    <tag k="name" v="Weinstube zum Büchsenmacher"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="addr:housename" v="5"/>
    <tag k="addr:street" v="Höllgasse"/>
  </node>
  <node id="1625565012" version="1" timestamp="2012-02-09T18:00:04Z" uid="131968" user="changchun_1" changeset="10636279" lat="48.8151893" lon="9.5310692">
    <tag k="name" v="Gasthaus Sonne"/>
    <tag k="amenity" v="restaurant"/>
  </node>
</osm>

我得到了这些结果 - 是的:我想用上面提到的标签来扩大它......

185612117   48.8037523  9.5248779   Courage
252619189   48.8067032  9.5314986   Kesselhaus
319597380   48.8277913  9.5477029   Gasthaus zur Linde
319597382   48.8282523  9.5503109   China-Garden
339591124   48.7888015  9.5079525   Pizzeria da Rocco
392682646   48.8315734  9.5468864   Gasthaus an der Wieslauf
454516720   48.8031264  9.5344371   Deutsches Haus
572362430   48.807953   9.5379673   Club Kneipe
613988559   48.7991827  9.551828    Gaststätte Schützenhaus
631421882   48.8070643  9.5437351   Remstalstuben
672817732   48.8045127  9.5254423   Hanti Alem
677555759   48.8048108  9.5243952   Weinstube St. Urban
677578941   48.8052132  9.5246951   Bei Domenico
677578944   48.8055998  9.5261987   Little Saigon

再次扩大xslt预处理器的有用标签是以下几个......

wheelchair
website    
addr:country
addr:street
addr:city
addr:housenumber

thx用于任何和所有帮助 - 提前thx

greetigngs

更新 - 我这样做 - 在复制标签名称的逻辑时 - 例如为网站添加标签 < / p>

<xsl:for-each select="../tag[@k='website']">
    <xsl:value-of select="@v"/>
    </xsl:for-each>
    <xsl:text>&#x0A;</xsl:text>
</xsl:for-each>

你说什么!?

1 个答案:

答案 0 :(得分:1)

您不需要for-each覆盖所有<tag />个节点,只需过滤所需的节点:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" encoding="utf-8" />

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="osm">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="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:value-of select="./tag[@k = 'name']/@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:street']/@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:housenumber']/@v"/>
        <xsl:text>&#x0A;</xsl:text>
    </xsl:template>

    <!-- all non-restaurant nodes -->
    <xsl:template match="node[tag[@k='amenity' and @v!='restaurant']]" />

</xsl:stylesheet>