Xml 如何在xslt中保留名称空间?
假设我有一个这样的xml文件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>
<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。