我想知道是否可以使用XSLT更改部分SOAP信封。我仅修改其中一部分的原因是因为其余部分是动态响应。
我有以下XML消息:
<SOAP-ENV:Body>
<xyz:TheResponse Status="S" xmlns:xyz="namespace">
<Hdr>
<Sndr>
...
</Sndr>
</Hdr>
<Command>
...
</Command>
<Data>
...
</Data>
</xyz:TheResponse>
</SOAP-ENV:Body>
我在XSLT下面使用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="namespace">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/SOAP-ENV:Body">
<abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService">
<xsl:copy-of select="*"/>
</abc:SomeServiceResp>
</xsl:template>
</xsl:stylesheet>
XSLT的结果如下:
<SOAP-ENV:Body>
<abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService" xmlns:tns="namespace">
<xyz:TheResponse Status="S" xmlns:xyz="namespace">
<Hdr>
<Sndr>
...
</Sndr>
</Hdr>
<Command>
...
</Command>
<Data>
...
</Data>
</xyz:TheResponse>
</abc:SomeServiceResp>
</SOAP-ENV:Body>
我得到了预期的结果,它在我的回复中添加了这一行
<abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService" xmlns:tns="namespace"
。
但是,我打算改变第二行:
<xyz:TheResponse Status="S" xmlns:xyz="namespace">
成
<tns:TheResponse Status="S" xmlns:tns="namespace">
保留“状态”,因为它是动态响应。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
如何更改模板以匹配TheReoponse
,然后像这样执行显式命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="namespace1"
xmlns:SOAP-ENV="SOAP"
xmlns:xyz="namespace">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/SOAP-ENV:Body">
<xsl:copy>
<abc:SomeServiceResp xmlns:abc="SomePackage.SOAP.SomeService">
<xsl:apply-templates/>
</abc:SomeServiceResp>
</xsl:copy>
</xsl:template>
<xsl:template match="xyz:TheResponse">
<tns:TheResponse xmlns:tns="namespace">
<xsl:attribute name="Status">
<xsl:value-of select="@Status"/>
</xsl:attribute>
<xsl:copy-of select="*"/>
</tns:TheResponse>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>