使用XSLT重命名和删除XML中的标记
我试图重命名和删除单个XSLT代码中的一些字段,但不知何故,重命名选项不起作用。 下面是我的带有SOAP标记的XML数据,需要删除这些标记并用所需的命名空间替换它们。同时,我应该更改XML标记的名称,因为源XML的特定名称应该更改 多谢各位 我的源XML使用XSLT重命名和删除XML中的标记,xml,xslt,rename,Xml,Xslt,Rename,我试图重命名和删除单个XSLT代码中的一些字段,但不知何故,重命名选项不起作用。 下面是我的带有SOAP标记的XML数据,需要删除这些标记并用所需的命名空间替换它们。同时,我应该更改XML标记的名称,因为源XML的特定名称应该更改 多谢各位 我的源XML <?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/e
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
<soapenv:Header/>
<soapenv:Body>
<ParentTag>
<tagRequest>
<Data1>FirstName</Data1>
<Data2>LastName</Data2>
<Value1>50</Value1>
<BooleanValue1>false</BooleanValue1>
<Address>
<StreetName>0000000</StreetName>
<Street-No>00000000000000</Street-No>
</Address>
</tagRequest>
</ParentTag>
</soapenv:Body>
</soapenv:Envelope>
目标输出XML应为:
<ns0:MainNode xmlns:ns0="http://test/system">
<ParentTag>
<tagRequest>
<Data1>FirstName</Data1>
<Data2>LastName</Data2>
<Value1>50</Value1>
<BooleanValue1>false</BooleanValue1>
<Address>
<StreetName>0000000</StreetName>
<StreetNo>00000000000000</StreetNo>
</Address>
</tagRequest>
</ParentTag>
</ns0:MainNode>
下面是我尝试过的XSLT:
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<ns0:MainNode xmlns:ns0="http://test/system">
<xsl:copy-of select="soapenv:Envelope/soapenv:Body/*" />
</ns0:MainNode>
</xsl:template>
<xsl:template match="Street-No">
<xsl:element name= "StreetNo">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将的xsl:copy更改为xsl:apply模板并添加标识模板。在这些更改之后,街道模板将不匹配。xsl:copy of实际上只复制元素树,而不在树上应用模板。这必须通过xsl:apply-templates来完成,它使用标识模板来复制与更特定模板不匹配的所有节点
我还将匹配表达式更改为与命名空间无关,如*[local name='Envelope']/*[local name='Body']/*这样就根本不使用soap命名空间
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<ns0:MainNode xmlns:ns0="http://test/system">
<xsl:apply-templates select="*[local-name()='Envelope']/*[local-name()='Body']/*" />
</ns0:MainNode>
</xsl:template>
<xsl:template match="Street-No">
<xsl:element name= "StreetNo">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出为:
非常感谢。我得到了期望的输出。但是它的名称空间附加为xmlns:soapenv=。有没有一种方法可以抑制这种情绪?@Ven:是的。是否可能您没有复制整个样式表?因为将XPath soapenv:Envelope/soapenv:Body/*替换为*[local name='Envelope']/*[local name='Body']/*并删除xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ 在这种情况下,xsl:stylesheet元素是故意使用的。
<?xml version="1.0" encoding="UTF-8"?>
<ns0:MainNode xmlns:ns0="http://test/system">
<ParentTag>
<tagRequest>
<Data1>FirstName</Data1>
<Data2>LastName</Data2>
<Value1>50</Value1>
<BooleanValue1>false</BooleanValue1>
<Address>
<StreetName>0000000</StreetName>
<StreetNo>00000000000000</StreetNo>
</Address>
</tagRequest>
</ParentTag>
</ns0:MainNode>