Xml 如何在xslt中保留名称空间?

Xml 如何在xslt中保留名称空间?,xml,xslt,Xml,Xslt,假设我有一个这样的xml文件 <a> <b> <c> <n xmlns="http://www.abcd.com/play/soccer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.abcd.com/bgft"> <document>

假设我有一个这样的xml文件

<a>
  <b>
    <c>
      <n xmlns="http://www.abcd.com/play/soccer"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.abcd.com/bgft">
         <document>
            <docbody>
                ......
                ......
                ......
            </docbody>
          </document>
       </n>
     </c>
  </b>
</a>

......
......
......
我想呈现xml,并在新元素下使用xslt复制该部分。但问题是,我无法在元素中使用这些名称空间呈现xml。因此,我必须通过xslt删除这些名称空间,但我需要在输出xml中使用这些名称空间。我的输出xml应该是这样的

<m>
  <n>
    <o>
      <n xmlns="http://www.abcd.com/play/soccer"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.abcd.com/bgft">
          <abc>
              <document>
                <docbody>
                    ......
                    ......
                    ......
                </docbody>
              </document>
           </abc>
         </n>
      </o>
    </n>
</m>

......
......
......
这里有一个新元素


如何通过元素删除名称空间并在最终输出中复制amd保留名称空间?请帮助。

我不明白您为什么要删除然后恢复名称空间。如果在将
c
元素转换为
o
元素时,只需复制该元素的子节点,则完成以下操作:

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

<xsl:template match="c">
  <o>
   <xsl:apply-templates/>
  </o>
</xsl:template>

<xsl:template match="a">
  <m>
   <xsl:apply-templates/>
  </m>
</xsl:template>

<xsl:template match="b">
  <n>
   <xsl:apply-templates/>
  </n>
</xsl:template>

这里没有任何名称空间的“添加”或“删除”,您只需将元素名称
a
b
c
(无名称空间)转换为
m
n
o
(也无名称空间)并在
http://www.abcd.com/play/soccer
原始
{http://www.abcd.com/play/soccer}n
元素及其子元素

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:play="http://www.abcd.com/play/soccer"
                exclude-result-prefixes="play">

  <!-- identity template - copy everything as-is unless we say otherwise -->
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

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

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

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

  <!-- Match the original <n xmlns="http://www.abcd.com/play/soccer"> element.
       We have to use a prefix for this because no prefix always means no
       namespace in XPath -->
  <xsl:template match="play:n">
    <xsl:copy>
      <!-- preserve the xsi:schemaLocation attribute -->
      <xsl:apply-templates select="@*" />
      <!-- insert an abc element in the right namespace -->
      <abc xmlns="http://www.abcd.com/play/soccer">
        <xsl:apply-templates />
      </abc>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>


谢谢您的回复,先生。我的输出基本上是预定义的格式。我需要复制那个元素。我的主要问题是保留输出格式的mnamespace和mach。我的问题是我能够复制该元素,但为此我必须删除名称空间。但根据输出格式,我不想包含这些名称空间。请告诉我如何保留这些名称空间。谢谢您的回复,先生。我的输出基本上是预定义的格式。我需要复制那个元素。我的主要问题是保留输出格式的mnamespace和mach。我的问题是我能够复制该元素,但为此我必须删除名称空间。但根据输出格式,我不想包含这些名称空间。请告诉我如何保留这些名称空间。@SubhadipBanerjee我仍然不明白你所说的“添加”和“删除”名称空间是什么意思。对于问题中的输入和输出XML,此样式表将完全满足您的要求,如果这不是您需要的,请创建另一个问题,并提供更真实的输入和输出示例以及您迄今为止尝试过的XSLT。