如何在xslt中保留命名空间?

时间:2013-09-02 14:45:29

标签: 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>
            <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 retain命名空间?请帮忙。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

此处没有“添加”或“删除”任何名称空间,您只是将元素名称abc(在没有名称空间中)转换为{{ 1}},mn(也在无命名空间中)并在原始o元素及其子元素之间的abc命名空间中添加http://www.abcd.com/play/soccer元素

{http://www.abcd.com/play/soccer}n