用于名称空间修改的XSLT

时间:2014-04-10 08:50:39

标签: xml xslt

我有一个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

2 个答案:

答案 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>