Как мы можем удалить пространство имен в элементах уровня 1 xml с помощью xslt

у меня есть этот xml

<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <UserInfo xmlns="">
      <name>ss</name>
      <addr>XXXXXX</addr>
     </UserInfo>
</Request>

Я хочу, чтобы вывод XML как

<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <UserInfo>
          <name>ss</name>
          <addr>XXXXXX</addr>
         </UserInfo>
    </Request>

Пожалуйста, помогите мне в xsl..


person Ironman    schedule 12.04.2013    source источник


Ответы (1)


Ваш ввод и вывод семантически одинаковы, но если вы хотите удалить этот xmlns="", это сработает:

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

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

При запуске на вашем образце ввода результат будет следующим:

<Request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserInfo>
    <name>ss</name>
    <addr>XXXXXX</addr>
  </UserInfo>
</Request>
person JLRishe    schedule 12.04.2013
comment
Большое спасибо за вашу помощь. Но я пробовал с другим xml, он не работает с этим xml.. пожалуйста, помогите.. ‹Request xmlns=hgkg.ghg.com xmlns:xsi=w3.org/ 2001/XMLSchema-instance xmlns:xsd=w3.org/2001/XMLSchema › ‹AppointmentInfo xmlns=› ‹AppointmentId/› ‹CountryCode›US‹/CountryCode› ‹Division›A‹/Division› ‹/AppointmentInfo› ‹/Request› - person Ironman; 12.04.2013
comment
@SrivatsavaSesham: это не (правильно сформированный) XML. Кроме того, уточнить не работает. Какой результат вы получили? - person LarsH; 12.04.2013
comment
я получаю то же самое ‹Request xmlns=hgkg.ghg.com xmlns:xsi=w3.org/2001/XMLSchema-instance xmlns:xsd=w3.org/2001/XMLSchema› ‹AppointmentInfo xmlns=› ‹AppointmentId/› ‹CountryCode›US‹/CountryCode› ‹Division›A‹/Division › ‹/Информация о назначении› ‹/Запрос› - person Ironman; 12.04.2013
comment
+1 хороший ответ. Примечание match="*[parent::*]" эквивалентно match="*/*". - person LarsH; 12.04.2013
comment
@Sri: теперь ваш ввод и вывод семантически не совпадают, поэтому предложенное решение не работает. Вы хотите, чтобы <AppointmentInfo> было в пространстве имен hgkg.ghg.com или ни в каком пространстве имен? - person LarsH; 12.04.2013
comment
давайте продолжим это обсуждение в чате - person Ironman; 12.04.2013