我有一个输入SOAP消息,它有多个命名空间属性。我想从许多属性中替换一个属性值,并保持其他属性相同。
我的输入是
<abc:outerblock xmlns:abc="http://www.example1.com/" xmlns:abc2="www.example2.com" xmlns:abc4="http://www.example4.com" >
<abc4:innerblock>
<abc4:entry1>22</abc4:entry1>
<abc4:entry2>xyz</abc4:entry2>
</abc4:innerblock>
</abc:outerblock>
我的输出应该是这样的。
<abc:outerblock xmlns:abc="http://www.changed.com/" xmlns:abc2="www.example2.com" xmlns:abc4="http://www.example4.com" >
<abc4:innerblock>
<abc4:entry1>22</abc4:entry1>
<abc4:entry2>xyz</abc4:entry2>
</abc4:innerblock>
</abc:outerblock>
在stackoverflow上尝试了很多解决方案之后。我提出了这个解决方案。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[namespace-uri()='http://www.example1.com/']">
<xsl:element name="{name(.)}" namespace='http://www.changed.com/'>
<xsl:apply-templates select="node()|@*" />
</xsl:element></xsl:template>
</xsl:stylesheet>
但它会产生这样的结果。
<abc:outerblock xmlns:abc="http://www.changed.com/">
<abc4:innerblock xmlns:abc="http://www.example1.com/"
xmlns:abc2="www.example2.com"
xmlns:abc4="http://www.example4.com">
<abc4:entry1>22</abc4:entry1>
<abc4:entry2>xyz</abc4:entry2>
</abc4:innerblock>
</abc:outerblock>
所有标签都复制到子元素。任何帮助将不胜感激。