我有xml如下
<rnp xmsns="v1">
<ele1 line="1">
<ele2></ele2>
</ele1>
</rnp>
我想将其更改为
<rnp xmsns="v2">
<ele1 line="1">
<ele2></ele2>
</ele1>
</rnp>
使用xslt 1.0。
我在xsl以下使用。
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="v2">
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="rnp">
<rnp>
<xsl:apply-templates select="*"/>
</rnp>
</xsl:template>
</xsl:stylesheet>
但是这个xsl不会复制属性,因此不会在输出中生成line属性。
示例输出
<?xml version="1.0" encoding="UTF-8"?><rnp xmlns="v2"><ele1>1
<ele2/>
</ele1></rnp>
如何使用xslt仅更改xmlns attrbiute的文本?有没有其他方法可以使用xslt更改xmlns?我只有xslt 1.0的选项。
感谢。
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNS" select="'v2'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[true()]">
<xsl:element name="{local-name()}" namespace="{$pNS}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档(已更正为在命名空间"v1"
中生成:
<rnp xmlns="v1">
<ele1 line="1">
<ele2></ele2>
</ele1>
</rnp>
生成想要的正确结果:
<rnp xmlns="v2">
<ele1 line="1">
<ele2/>
</ele1>
</rnp>
请注意:
所需的新默认命名空间作为外部参数传递给转换 - 因此,在必须修改默认命名空间的情况下,可以使用没有任何修改的smae转换。
这个看似不寻常的模板匹配:<xsl:template match="*[true()]">
可以避免XSLT处理器“可恢复的歧义错误”消息,如果我们将其编码为<xsl:template match="*">
并且更短更优雅指定优先级。
答案 1 :(得分:0)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="v2">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出:
<rnp xmlns="v2">
<ele1 line="1">
<ele2 />
</ele1>
</rnp>