Xml 删除用于通过XSLT进行转换的标记

Xml 删除用于通过XSLT进行转换的标记,xml,xslt,Xml,Xslt,给定以下XML <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=

给定以下XML

<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>
生成以下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>
我试了几种不同的方法

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

部分。 但它要么不再产生期望的结果(添加节点),要么根本没有删除任何标记,或者删除许多标记(一些我想保留)。我还将它放在代码中的不同位置,但所有这些都不起作用

不需要第二个XSLT文件就可以做到这一点吗

p、 这是这篇文章的后续问题:

我建议采用一种稍微不同的方法:

XSLT1.0

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

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

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

</xsl:stylesheet>


使用原始样式表时,必须更改:

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

致:


但实际上,它可以用更少的钱来完成

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

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

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

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