0

你好,亲爱的 xml 朋友们,美好的一天,

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

新:请参阅我在此初始发布时添加的更新- 获取解决方案 ii 复制标签名称的逻辑... -> 我在初始发布结束时添加了一个示例。请让我知道你的 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 处理器

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

我运行以下代码: time xsltproc test3.xslt testdoc3.xml > Restaurants-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 文档上- 称为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

感谢所有帮助 - 提前感谢

问候

更新- 我这样做是这样 - 复制标签名称的逻辑- 例如为网站添加标签:

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

你说的话!?

4

1 回答 1

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>
于 2012-04-21T15:44:30.013 回答