2016-02-29 63 views
1

我有下面的XML文档(只是一个节选):如何通过XSLT删除和添加选择元素?

<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> 

我想这样做是得到以下结果:

<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> 

删除一切,除了每个以下标签:

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

但还添加了新的标签从k="ID" v=复制值:

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

回答

1

鉴于你的XML,修复被很好地形成使用上的结束osm标签作为开场osm标签相同的情况下,

<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> 

这个XSLT,基于身份的转变添加一个模板以静默请求的tag元素并添加一个模板以添加请求的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="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> 

会产生这种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> 

的要求。

+0

只是一个小问题如果我想要做所有提到的操作,但最后删除标签,我从'@k!='ID']变量''标记不能使这项工作...... –

+0

如果有帮助,请[**接受**](http://meta.stackoverflow.com/q/5234/234215)这个答案,并为您的新变体提出一个新问题。一定要像在这里一样展示新的预期输出的完整示例,并解释“无法使其工作”的含义。谢谢。 – kjhughes