繁体   English   中英

在XSLT中用XML替换节点

[英]Replace node in XML in XSLT

我想替换下面的节点

 <Test>
        <Test.1>1</Test.1>
        <Test.2>ABC</Test.2>
        <Test.3>XXX</Test.3>
   </Test>

因此,如果我的输入XML具有Test节点,那么“Test”node-name应该用节点名称替换为“aaa”输出应该是:

<aaa>
            <aaa.1>1</aaa.1>
            <aaa.2>ABC</aaa.2>
            <aaa.3>XXX</aaa.3>
 </aaa>

我尝试过:

 <xsl:when test="../name()='Test'">
     <aaa>
        <aaa.1>1</aaa.1>
        <aaa.2>ABC</aaa.2>
        <aaa.3>XXX</aaa.3>             
     </aaa>       

   </xsl:when>

您可以使用substring-after()来获取名称的其余部分并创建新名称...

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

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

  <xsl:template match="*[starts-with(local-name(),'Test')]">
    <xsl:element name="aaa{substring-after(local-name(),'Test')}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

正如我所看到的,你想要从Test开始更改节点名称,用aaa替换Test

要执行此任务,您需要一个模板匹配元素,其名称以Test开头。 它可以使用match属性中的谓词来创建:

match="*[starts-with(name(), 'Test')]"

该模板的内容应包括:

  • 使用更改的名称创建一个新元素( aaa +标记名称的“rest”)。
  • 将模板应用于当前元素的内容,就像在身份模板中一样
  • 关闭刚刚创建的元素。

当然,脚本还应包括身份模板

所以整个脚本可能如下所示:

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

  <xsl:template match="*[starts-with(name(), 'Test')]">
    <xsl:element name="aaa{substring(name(), 5)}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM