在xslt中替换多个名称空间属性的值

时间:2017-09-11 06:47:59

标签: xml xslt

我有一个输入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> 

所有标签都复制到子元素。任何帮助将不胜感激。

0 个答案:

没有答案