我们如何在xslt中将XML元素转换为不同的命名空间

时间:2013-04-12 19:48:18

标签: xslt xslt-1.0 xml-namespaces

我有输入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 namespace.I想要转换为它.. 请帮帮我

1 个答案:

答案 0 :(得分:3)

JLRishe's earlier answer的基础上,你可以试试这个:

<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(/*))的命名空间的输出元素。 / p>

看看是否有效......