2016-03-04 115 views
0

有这个XML,我需要删除所有的前缀,我之前做过,但有一个特定的NS2前缀,我无法删除。XSL - 如何删除此特定命名空间前缀?

检查:

输入XML

 <NS1:Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/"> 
<NS1:Header> 
<NS2:responseHeader xmlns:NS2="http://test.com"> 
    <systemId>SI</systemId> 
    <messageId>000001</messageId> 
    <timestamp>2015-01-16T10:10:09.872983</timestamp> 
<responseStatus> 
    <statusCode>Success</statusCode> 
    </responseStatus> 
    </NS2:responseHeader> 
    </NS1:Header> 
<NS1:Body> 
    <NS2:modificarSolicitudDeCreditoResponse xmlns:NS2="http://test2.com/21"/> 
    </NS1:Body> 
    </NS1:Envelope> 

我的XSLT:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="NS2:modificarSolicitudDeCreditoResponse"> 
    <modificarSolicitudDeCreditoResponse> 
    <xsl:apply-templates select="@*|node()"/> 
    </modificarSolicitudDeCreditoResponse> 
</xsl:template> 
<xsl:template match="NS1:Header"> 
    <Header> 
    <xsl:apply-templates select="@*|node()"/> 
    </Header> 
    </xsl:template> 
    <xsl:template match="NS2:responseHeader"> 
    <responseHeader> 
    <xsl:apply-templates select="@*|node()"/> 
    </responseHeader> 
    </xsl:template> 
    <xsl:template match="NS1:Body"> 
    <Body> 
    <xsl:apply-templates select="@*|node()"/> 
    </Body> 
    </xsl:template> 
     <xsl:template match="/*"> 
    <Envelope> 
    <xsl:apply-templates select="node()" /> 
    </Envelope> 
    </xsl:template> 
    </xsl:stylesheet> 

这是我的输出:

<?xml version='1.0' ?> 
<Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/" 
<Header> 
<responseHeader> 
    <systemId>AW0856</systemId> 
    <messageId>0000012</messageId> 
    <timestamp>2015-01-16T10:10:09.872983</timestamp> 
<responseStatus> 
    <statusCode>Success</statusCode> 
    </responseStatus> 
    </responseHeader> 
    </Header> 
<Body> 
    <NS2:modificarSolicitudDeCreditoResponse xmlns:NS2="http://test2.com/21"> 
    </Body> 
    </Envelope> 

林有后取出NS2问题身体t AG,有谁知道我怎么能做到这一点, 感谢

+0

请发布您期望得到的确切输出。 –

回答

0

这里是你如何删除XML输入的所有前缀:复制元素,同时(不含命名空间的名称)替换他们name()local-name()

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="xml" /> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

输出是

<?xml version="1.0"?> 
<Envelope> 
    <Header> 
     <responseHeader> 
      <systemId>SI</systemId> 
      <messageId>000001</messageId> 
      <timestamp>2015-01-16T10:10:09.872983</timestamp> 
      <responseStatus> 
       <statusCode>Success</statusCode> 
      </responseStatus> 
     </responseHeader> 
    </Header> 
    <Body> 
     <modificarSolicitudDeCreditoResponse/>    
    </Body> 
</Envelope> 

但是,这也将删除所有的命名空间的定义。目前我不知道你是如何处理这些的。