我正在尝试重命名和删除单个XSLT代码中的某些字段,但是以某种方式重命名选项不起作用。 以下是我的带有SOAP标记的XML数据,需要删除这些标记并将其替换为所需的名称空间。我应该同时更改XML标记的名称,因为应更改源xml的特定名称。
谢谢
我的源XML
nm
目标输出XML应该是:
ld -r
下面是我尝试过的XSLT:
<?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>
答案 0 :(得分:1)
将xsl:copy-of
更改为xsl:apply-templates
,然后添加身份模板。这些更改之后,Street-No
模板将匹配。 xsl:copy-of
实际上仅复制元素树,而没有在树上应用模板。必须使用xsl:apply-templates
完成此操作,该{<1>}使用身份模板复制所有与特定模板不匹配的节点。
我还将匹配表达式更改为与*[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>
输出为:
<?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>