0

假设我有一个这样的 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>

我想在新元素下使用 xslt 呈现该 xml 并复制该部分。但问题是我无法在元素中使用这些名称空间呈现该 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 保留命名空间?请帮忙。

4

2 回答 2

1

我不明白您为什么要删除然后恢复命名空间。如果您只是在将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>
于 2013-09-02T15:58:00.020 回答
0

这里没有任何命名空间的“添加”或“删除”,您只是将元素名称a、、bc(在无命名空间中)转换为mno(也在无命名空间中),并在原始元素和之间的命名空间abc中添加一个元素它的孩子。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>
于 2013-09-02T18:04:48.187 回答