【问题标题】:XSL - How to remove this specific Namespace Prefix?XSL - 如何删除这个特定的命名空间前缀?
【发布时间】:2016-03-04 21:27:09
【问题描述】:

有这个 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>

我在删除 body 标签后的 NS2 时遇到问题,有谁知道我如何实现这一点, 谢谢

【问题讨论】:

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

标签: xml xslt namespaces output


【解决方案1】:

以下是删除输入 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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多