2015-09-17 6 views
1

Я хочу удалить пространство имен (xmlns = "http://www.cric.com") в корневой элемент, а также комментарии. Input XML выглядит следующим образомxslt Удаление определенного пространства имен только из корня

  <?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> 

Эта таблица стилей удаляет из корня, но добавление имен в soapenv: Конверт тегов.

Желаемая выход

<?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

+0

Просьба показать нам вывод, который вы хотите создать для введенного образца, который вы опубликовали, а также вывод, который вы получаете в настоящее время с вашим опубликованным кодом. Также объясните, используете ли вы процессор XSLT 1.0 или 2.0. –

+0

И почему у вас есть проверка '', хотя в образце XML нет элемента с именем 'root'? –

+1

И ваш входной образец имеет закрытие '' без открытия ''. –

ответ

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 = «http://www.cric.com») в корневом элементе

Я не уверен, если вы понимаете, что пространство имен по умолчанию объявляются в корневой элемент:

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

также наследуется Set и Payload элементов.

+0

удаляет пространство имен из корня, но добавляет ненужные пространства имен в другом теге, например india Ashes

+1

@Ashes Эти объявления пространства имен не являются «ненужными».Напротив: они ** обязательны **: без них результат не будет хорошо сформированным XML-документом (вы не можете использовать префикс, не привязывая его к пространству имен). Обратите также внимание на то, что одни и те же декларации пространства имен появляются - совершенно правильно - в желаемом выводе. –

+0

namespace "xmlns: web =" http://www.webserviceX.NET "должно быть в не в . – Ashes

Смежные вопросы