xslt仅从root用户

时间:2015-09-17 10:15:50

标签: xslt

我想删除根元素中的命名空间(xmlns =" http://www.cric.com")以及注释。 输入xml看起来像这样

         <?xml version="1.0" encoding="UTF-8"?>
            <AM xmlns="http://www.cric.com" name="Asmkl">
                <!-- Sets a new value to the existing parameter -->
<set>
                    <Payload>
                        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webserviceX.NET">
                            <soapenv:Header />
                            <soapenv:Body>
                                <web:GetCitiesByCountry>
                                    <!--Optional:-->
                                    <web:CountryName>india</web:CountryName>
                                </web:GetCitiesByCountry>
                            </soapenv:Body>
                        </soapenv:Envelope>
                    </Payload>
                    <Verb>POST</Verb>
                </Set>
            </AM>

我试过了

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:template match="*[namespace-uri() = 'http://www.cric.com']"> 
    <xsl:choose> 
       <xsl:when test="local-name(.)='root'"> 
        <xsl:element name="root"> 
          <xsl:apply-templates select="@* | node()"/> 
        </xsl:element> 
      </xsl:when>  
      <!-- Copy other elemnts -->  
      <xsl:otherwise> 
        <xsl:element name="{name()}"> 
          <xsl:apply-templates select="@* | node()"/> 
        </xsl:element> 
      </xsl:otherwise> 
    </xsl:choose> 
  </xsl:template>  
  <!-- Copy the rest -->  
  <xsl:template match="@* | node()"> 
    <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
  </xsl:template> 
</xsl:stylesheet>

此样式表从root中删除,但在soapenv:Envelope标记中添加名称空间。

所需的输出

    <?xml version="1.0" encoding="UTF-8"?>
            <AM name="Asmkl">
              <Set>
                    <Payload>
                        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webserviceX.NET">
                            <soapenv:Header />
                            <soapenv:Body>
                                <web:GetCitiesByCountry>
                                    <web:CountryName>india</web:CountryName>
                                </web:GetCitiesByCountry>
                            </soapenv:Body>
                        </soapenv:Envelope>
                    </Payload>
                    <Verb>POST</Verb>
                </Set>
            </AM>

但我正在

<?xml version="1.0" encoding="UTF-8"?><AM name="Asmkl">

    <!-- Sets a new value to the existing parameter -->
    <Set>
       <Payload>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webserviceX.NET" xmlns="http://www.cric.com">
   <soapenv:Header/>
   <soapenv:Body>
      <web:GetCitiesByCountry>
         <!--Optional:-->
         <web:CountryName>india</web:CountryName>
      </web:GetCitiesByCountry>
   </soapenv:Body>
</soapenv:Envelope>
      </Payload>
      <Verb>POST</Verb>
    </Set>
</AM>

请建议。 XSLT处理器是1.0

1 个答案:

答案 0 :(得分:2)

怎么样:

XSLT 1.0

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

<!-- move elements in the default namespace into no namespace -->
<xsl:template match="*[namespace-uri() = 'http://www.cric.com']">
    <xsl:element name="{local-name()}"> 
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="*"/>
    </xsl:element> 
</xsl:template>

<!-- "copy" all other elements, without copying the default namespace -->
<xsl:template match="*">
    <xsl:element name="{name()}" namespace="{namespace-uri()}"> 
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="*"/>
    </xsl:element> 
</xsl:template>

</xsl:stylesheet>

应用于您的示例(在将<set>更正为<Set>之后!),结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<AM name="Asmkl">
   <Set>
      <Payload>
         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Header/>
            <soapenv:Body>
               <web:GetCitiesByCountry xmlns:web="http://www.webserviceX.NET">
                  <web:CountryName/>
               </web:GetCitiesByCountry>
            </soapenv:Body>
         </soapenv:Envelope>
      </Payload>
      <Verb/>
   </Set>
</AM>

注意:

  

我想删除根目录中的命名空间(xmlns =&#34; http://www.cric.com")   元件

我不确定您是否意识到在根元素中声明的默认命名空间:

<AM xmlns="http://www.cric.com" name="Asmkl">

也由SetPayload元素继承。