我有一个XSLT转换,它给出了一些xml,我希望它能改变xml的命名空间URI。
输入XML:
<given xmlns="http://www.sample.co.uk/version/6">
<child>content here</child>
</given>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/node()[1]" >
<xsl:element name="{local-name()}" namespace="{concat(substring-before(namespace-uri(), '/6'),'/7')}" >
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出XML:
<given xmlns="http://www.sample.co.uk/version/7">
<child xmlns="">content here</child>
</given>
XSLT转换按预期工作,但正如您所看到的,它在子节点<child xmlns="">
中包含一个空命名空间。我希望输出子节点只是<child>
。我怎样才能做到这一点?
提前致谢, PM
答案 0 :(得分:1)
如果根元素具有xmlns="http://www.sample.co.uk/version/6"
,则该命名空间适用于所有子元素和子元素,因此基本上您需要确保您的XSLT更改所有元素的命名空间。
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="{concat(substring-before(namespace-uri(), '/6'),'/7')}" >
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
答案 1 :(得分:0)
您可以将新的默认命名空间添加到xsl:stylesheet
。但是,如果你真的需要进行字符串操作来获取新的URI,那么这对你来说不会有用。
XML输入
<given xmlns="http://www.sample.co.uk/version/6">
<child>content here</child>
</given>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.sample.co.uk/version/7">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()" priority="-1">
<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>
XML输出
<given xmlns="http://www.sample.co.uk/version/7">
<child>content here</child>
</given>