xslt-replace命名空间uri单独

时间:2013-09-25 15:32:18

标签: xml namespaces xslt-1.0

在我的xml中,名称空间http://abc.com/source/error应替换为http://abc.com/error/i1。我必须使用xslt1.0,单独替换uri部分非常具有挑战性。所有其他应该与输出一样。如果此命名空间不存在,则输入xml应按原样传递给输出。

我的输入xml

<a xmlns:hj="http://abc.com/source/error">
<hj:b>sam</hj:b>
</a>

预期产出

<a xmlns:hj="http://abc.com/source/error/i1">
<hj:b>sam</hj:b>
</a>

1 个答案:

答案 0 :(得分:0)

这个XSLT将完成这项工作。但请注意,只有输入XML的名称空间前缀等于hj:

时,它才有效
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:hjold="http://abc.com/source/error" xmlns:hj="http://abc.com/source/error/i1" exclude-result-prefixes="hjold">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="a[namespace-uri-for-prefix('hj', /*) != '']">
        <a xmlns:hj="http://abc.com/source/error/i1">
            <xsl:apply-templates select="@*|node()" />
        </a>
    </xsl:template>

    <xsl:template match="hjold:*" >
        <xsl:element name="hj:{local-name()}">
            <xsl:apply-templates select="@*|node()" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="*" >
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

要在XSLT 1.0中使用并且命名空间在输出中无关紧要,即使没有声明名称空间,也要更改:

 <xsl:template match="a[namespace-uri-for-prefix('hj', /*) != '']">

 <xsl:template match="a">