How to remove and add select elements via XSLT?

2019-08-12 22:07发布

I have the following XML document (just an excerpt):

<osm>
  <node id="1" version="1" timestamp="2016-02-29T01:33:20Z" lat="0.0" lon="0.657002">
    <tag k="Stat_nr" v="40045"/>
    <tag k="Ortsgr_kl" v="0"/>
    <tag k="Town_ID" v="0000"/>
    <tag k="Name2" v="City2"/>
    <tag k="Name1" v="City1"/>
    <tag k="ID" v="8942835"/>
  </node>
  <node id="2" version="1" timestamp="2016-02-29T01:33:20Z" lat="0.93198" lon="0.000">
    <tag k="Land" v="D"/>
    <tag k="ID_Ref" v=""/>
    <tag k="Stat_nr" v="40045"/>
    <tag k="Name1" v="ExampleCity"/>
    <tag k="ID" v="0000"/>
  </node>
</osm>

What i would like to do is get the following result:

<osm>
  <node id="1" version="1" timestamp="2016-02-29T01:33:20Z" lat="0.0" lon="0.657002">
    <tag k="Stat_nr" v="40045"/>
    <tag k="Name1" v="City1"/>
    <tag k="ID" v="8942835"/>
    <tag k="test" v="8942835"/>
  </node>
  <node id="2" version="1" timestamp="2016-02-29T01:33:20Z" lat="0.93198" lon="0.000">
    <tag k="Stat_nr" v="40045"/>
    <tag k="Name1" v="ExampleCity"/>
    <tag k="ID" v="0000"/>
    <tag k="test" v="0000"/>
  </node>
</osm>

Delete everything except each of the following tags:

<tag k="Stat_nr">
<tag k="Name1"  >
<tag k="ID" >

But also add a new tag copying the values from the k="ID" v=:

<tag k="test" v="8942835"/>
<tag k="test" v="0000"/>

标签: xml xslt
1条回答
Fickle 薄情
2楼-- · 2019-08-12 22:50

Given your XML, repaired to be well-formed by using the same case on the closing osm tag as the opening osm tag,

<osm>
  <node id="1" version="1" timestamp="2016-02-29T01:33:20Z" lat="0.0" lon="0.657002">
    <tag k="Stat_nr" v="40045"/>
    <tag k="Ortsgr_kl" v="0"/>
    <tag k="Town_ID" v="0000"/>
    <tag k="Name2" v="City2"/>
    <tag k="Name1" v="City1"/>
    <tag k="ID" v="8942835"/>
  </node>
  <node id="2" version="1" timestamp="2016-02-29T01:33:20Z" lat="0.93198" lon="0.000">
    <tag k="Land" v="D"/>
    <tag k="ID_Ref" v=""/>
    <tag k="Stat_nr" v="40045"/>
    <tag k="Name1" v="ExampleCity"/>
    <tag k="ID" v="0000"/>
  </node>
</osm>

this XSLT, based on the identity transformation with one template added to squelch the requested tag elements and one template added to append the requested tag elements,

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="tag[@k!='Stat_nr' and @k!='Name1' and @k!='ID']"/>

  <xsl:template match="tag[@k='ID']">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <tag k="test" value="{@v}"/>
  </xsl:template>

</xsl:stylesheet>

will produce this XML,

<?xml version="1.0" encoding="UTF-8"?>
<osm>
   <node id="1"
         version="1"
         timestamp="2016-02-29T01:33:20Z"
         lat="0.0"
         lon="0.657002">
      <tag k="Stat_nr" v="40045"/>
      <tag k="Name1" v="City1"/>
      <tag k="ID" v="8942835"/>
      <tag k="test" value="8942835"/>
   </node>
   <node id="2"
         version="1"
         timestamp="2016-02-29T01:33:20Z"
         lat="0.93198"
         lon="0.000">
      <tag k="Stat_nr" v="40045"/>
      <tag k="Name1" v="ExampleCity"/>
      <tag k="ID" v="0000"/>
      <tag k="test" value="0000"/>
   </node>
</osm>

as requested.

查看更多
登录 后发表回答