将XML转换为另一种XML

时间:2017-01-04 12:28:07

标签: .net xml xslt

我是XSLT的新手

我输入xml为

markSubString

输出XML是

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<urn:LookupRecords xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:a="urn:RedIron.RetailRepository.Core" xmlns:urn="urn:RedIron.RetailRepository.Services.SearchService">
<urn:query>
<a:Headers>
<a:SearchHeader>
<a:SearchHeader>
<a:SearchHeader>
</a:Headers>
<a:Params>
<arr:KeyValueOfguidArrayOfQueryParametertmL6yAXy>
</a:Params>
</urn:query>
</urn:LookupRecords>
</soapenv:Body>
</soapenv:Envelope>

现在我正在尝试使用XSLT(例如

)更改转换
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetRecordResponse xmlns="urn:RedIron.RetailRepository.Services.SearchService">
<GetRecordResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="urn:RedIron.RetailRepository.Core">
<a:Exception i:nil="true"/>
<a:ResponseHeaders>
<a:SearchResults>
<a:StatusCode>Success</a:StatusCode>
<a:StatusCodeReason i:nil="true"/>
</GetRecordResult>
</GetRecordResponse>
</s:Body>
</s:Envelope>

但收到错误“格式不正确:元素”的前缀“s”:信封“未绑定。”

你能帮忙吗

1 个答案:

答案 0 :(得分:0)

如前所述,名称空间声明不是属性,不能使用xsl:attribute指令创建。为了编写XSLT片段中显示的文字结果元素,您需要更改以下代码:

<s:Envelope>
<xsl:attribute name="xmlns:s"><xsl:value-of select="xmlns:soapenv"/></xsl:attribute>
<s:Body>
</s:Body>
</s:Envelope> 

为:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
</s:Body>
</s:Envelope> 

请注意,声明是包含它的节点的所有后代的范围内(因此不需要为s:Body元素重复它)。通常,您会在顶级xsl:stylesheet标记中包含所有命名空间声明。