我有以下xml:
<ns0:Root xmlns:ns0="http://root" xmlns:nm="http://notroot">
<nm:MSH>
<content>bla</content>
</nm:MSH>
<ns0:Second>
<ns0:item>aaa</ns0:item>
</ns0:Second>
<ns0:Third>
<ns0:itemb>vv</ns0:itemb>
</ns0:Third>
</ns0:Root>
这是我的预期结果:
<Root xmlns="http://root" xmlns:nm="http://notroot">
<nm:MSH>
<content>bla</content>
</nm:MSH>
<Second>
<item>aaa</item>
</Second>
<Third>
<itemb>vv</itemb>
</Third>
</Root>
我需要编写一个执行该映射的xslt 1.0。
我真的不知道怎么做,所以看起来很简单。
有人可以帮忙吗?
答案 0 :(得分:1)
将元素从xmlns:ns0="http://root"
命名空间移动到默认命名空间。
使用:
<xsl:template match="ns0:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
使http://root
默认命名空间将xmlns="http://root"
添加到样式表声明。
因此你可以尝试这样的事情:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ns0="http://root"
xmlns="http://root"
exclude-result-prefixes="ns0" >
<!-- Identity transform (e.g. http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!-- match root element and fore notroot namespace to this -->
<xsl:template match="/*">
<Root xmlns:nm="http://notroot">
<xsl:apply-templates select="@*|node()" />
</Root>
</xsl:template>
<xsl:template match="content">
<content>
<xsl:apply-templates select="@*|node()" />
</content>
</xsl:template>
<!-- move attributes with prefix ns0 to default namespace -->
<xsl:template match="@ns0:*">
<xsl:attribute name="newns:{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<!-- move elements with prefix ns0 to default namespace -->
<xsl:template match="ns0:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
输入和输出之间的唯一区别是content
内的nm:MSH
元素已从无名称空间转移到http://root
名称空间中。这可以通过调整身份转换来处理:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ns0="http://root">
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="content">
<ns0:content><xsl:apply-templates select="@*|node()" /></ns0:content>
</xsl:template>
</xsl:stylesheet>