[英]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')]"
该模板的内容应包括:
当然,脚本还应包括身份模板 。
所以整个脚本可能如下所示:
<?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.