【问题标题】:How to remove and add select elements via XSLT?如何通过 XSLT 删除和添加选择元素?
【发布时间】:2016-02-29 19:58:15
【问题描述】:

我有以下 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>

我想做的是得到以下结果:

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

【问题讨论】:

    标签: xml xslt


    【解决方案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>
    

    根据要求。

    【讨论】:

    • 只是一个小问题,如果我想执行所有提到的操作,但最后删除了我从@k!='ID']tags 中获取变量的标签,那该怎么办...
    • 如果有帮助,请accept 这个答案,并为您的新变体提出一个新问题。请务必像您在此处所做的那样展示新的预期输出的完整示例,并解释“无法使其工作”的意思。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2012-07-20
    相关资源
    最近更新 更多