XSL - 如何删除此特定的命名空间前缀?

时间:2016-03-04 21:27:09

标签: xml xslt namespaces output

拥有这个XML,我需要删除所有前缀,我之前已经这样做了,但是有一个特定的NS2前缀我无法删除。

检查:

输入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时遇到问题,有谁知道我怎么能做到这一点, 感谢

1 个答案:

答案 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>

但这也删除了所有命名空间定义。目前我不知道你喜欢如何处理这些。