【问题标题】:How to use XSLT to replace an element that is in a namespace?如何使用 XSLT 替换命名空间中的元素?
【发布时间】:2021-03-20 02:24:27
【问题描述】:

我需要使用 XSL 转换将 XML 中的元素替换为新元素。输入 XML 包含名称空间声明。我确实通过在 XSLT 中声明相同的命名空间并在模板中添加命名空间前缀来匹配元素。但是我不能在同一个命名空间中插入新元素。

输入 XML

<?xml version="1.0" encoding="utf-8"?>
<ledesxmlebilling2.1 xmlns="http://www.ledes.org/ledes21.xsd">
  <firm>
    <client>
      <invoice>
        <matter>
          <tksum>
            <tk_id>Sample ID</tk_id>
            <tk_lname>Sample last name</tk_lname>
            <tk_fname />
            <tk_level>Sample level</tk_level>
            <tk_rate>Sample rate</tk_rate>
          </tksum>
        </matter>
      </invoice>
    </client>
  </firm>
</ledesxmlebilling2.1>

XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:ledes="http://www.ledes.org/ledes21.xsd" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

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

  <!-- tksum template -->
  <xsl:template match="ledes:tksum">
    <tksum>
      <tk_id>New ID</tk_id>
      <tk_lname>New last name</tk_lname>
      <tk_fname />
      <tk_level>New level</tk_level>
      <tk_rate>New rate</tk_rate>
    </tksum>
  </xsl:template>
</xsl:stylesheet>

当前输出 XML

<?xml version="1.0" encoding="utf-8"?>
<ledesxmlebilling2.1 xmlns="http://www.ledes.org/ledes21.xsd">
  <firm>
    <client>
      <invoice>
        <matter>
          <tksum xmlns="" xmlns:ledes="http://www.ledes.org/ledes21.xsd">
            <tk_id>New ID</tk_id>
            <tk_lname>New last name</tk_lname>
            <tk_fname />
            <tk_level>New level</tk_level>
            <tk_rate>New rate</tk_rate>
          </tksum>
        </matter>
      </invoice>
    </client>
  </firm>
</ledesxmlebilling2.1>

所需的输出 XML

<?xml version="1.0" encoding="utf-8"?>
<ledesxmlebilling2.1 xmlns="http://www.ledes.org/ledes21.xsd">
  <firm>
    <client>
      <invoice>
        <matter>
          <tksum>
            <tk_id>New ID</tk_id>
            <tk_lname>New last name</tk_lname>
            <tk_fname />
            <tk_level>New level</tk_level>
            <tk_rate>New rate</tk_rate>
          </tksum>
        </matter>
      </invoice>
    </client>
  </firm>
</ledesxmlebilling2.1>

我应该如何更改 XSLT 以获得所需的输出 XML?

【问题讨论】:

    标签: xml xslt namespaces


    【解决方案1】:

    我无法在同一个命名空间中插入新元素。

    其实很简单——试试吧:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ledes="http://www.ledes.org/ledes21.xsd" 
    exclude-result-prefixes="ledes">
    <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="ledes:tksum">
        <tksum xmlns="http://www.ledes.org/ledes21.xsd">
            <tk_id>New ID</tk_id>
            <tk_lname>New last name</tk_lname>
            <tk_fname />
            <tk_level>New level</tk_level>
            <tk_rate>New rate</tk_rate>
        </tksum>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 或者使用xsl:copy,而不是重新定义同名元素并绑定到同一个命名空间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2021-05-17
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多