在我的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>
此 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">