Как мы можем преобразовать элементы XML в другое пространство имен в xslt

У меня есть входной xml

<Request xmlns="http://hgkg.ghg.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   <AppointmentInfo xmlns="">

      <AppointmentId/>

      <CountryCode>US</CountryCode>

      <Division>A</Division>
    </AppointmentInfo>
  <AppointDate xmlns="">
   <Day>Monday</Day>
    <Date>April 2</Date>
  <AppointDate>

</Request>

Мне нужен такой вывод

<Request xmlns="http://hgkg.ghg.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   <AppointmentInfo>

      <AppointmentId/>

      <CountryCode>US</CountryCode>

      <Division>A</Division>
    </AppointmentInfo>
    <AppointDate>
       <Day>Monday</Day>
        <Date>April 2</Date>
      <AppointDate>
</Request>

я просто хочу удалить xmlns="" в этом и предположить, что ответ AppointmentInfo и AppointDate находятся в пространстве имен hgkg. Я хочу преобразовать его .. пожалуйста, помогите мне


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


Ответы (1)


Основываясь на более раннем ответе JLRishe, вы можете попробовать следующее:

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

Это будет означать, что каждый элемент, который не является самым внешним элементом (match="*/*"), копируется в выходной элемент с тем же именем, но с пространством имен самого внешнего элемента (namespace-uri(/*)).

Посмотрите, работает ли это...

person LarsH    schedule 12.04.2013
comment
@Ironman: Не за что... Думаю, ты сменил имя. :-) В следующий раз скажите человеку, который дает вам эти запросы, чтобы они определялись не с точки зрения добавления/удаления объявлений пространств имен, а с точки зрения того, в каком пространстве имен должен находиться каждый элемент. ) предназначены для предсказуемой интерпретации и управления. Первая — это поверхностная структура, которая может меняться по прихоти сериализатора. - person LarsH; 13.04.2013